Поиск

Сообщения о возможных ошибках и их протоколирование

В языке РНР есть хорошая встроенная поддержка для генерации сообщений об ошибках и их обработки. Вы сможете многому научиться с помощью этих средств.

Функция error_reporting ( ) указывает, о каких типах ошибок РНР должен информировать. Строка error_reporting ( 0 ) полностью отключает составле ние сообщений об ошибках. Ошибки все равно будут, просто вы о них больше не узнаете. И наоборот, строка error_reporting(E_ALL) будет выдавать сооб щения обо всех произошедших ошибках. (В руководстве по РНР, а также в таб лице С.6 (приложение С) представлена информация об уровнях, которые мож но задать в отношении сообщений об ошибках.)

Функция error_reporting ( ) «говорит» о том, какие ошибки должны сопро вождаться сообщениями, а функция error_log () «инструктирует» РНР, как протоколировать ошибки:

error_log()("message", "type", "destination"};

При возникновении проблемы ошибка может быть автоматически записа на в файл протокола, либо же вы получите соответствующее сообщение по электронной почте. Разумное использование функции error_log() позволяет Webмастерам и программистам постоянно знать, что происходит на их Web сайтах. Чтобы в случае ошибки вы получали информацию по электронной по чте, добавьте в ваш код следующую строку:

error_log()("message", "1", "php@DMCinsights.com");

Изменим сценарий email.php (глава 13) так, чтобы, если не удалось отпра вить информацию по электронной почте, осуществлялась запись в файл.

Использование функции error_log()

  1. Откройте файл email.php в текстовом редакторе (листинг 14.3). Листинг 14.3 т Это сценарий email.php, взятый из главы 13. В настоящее время он не имеет функции протоколирования ошибок, которая сделала бы его более полезным.
  2. 1 <?php
    2 $PageTitle = "Sending Emails";
    3 require ("header.php");
    4 if ($BeenSubmitted) {
    5 if ($MailTo) {
    6 if (mail ($Ma'ilTo, $Subject, $Body, "From: SMailFrom")) {
    7 print ("<BxCENTERxFONT COLOR=BLUE>Your email has been
    successfully sent!</FONTx/CENTERx/B>\n") ;
    8 } else {
    9 print ("<BxCENTERxFONT COLOR=RED>Your email was not
    successfully sent due to a system error!</FONTx/CENTER>
    10 } ' ' '
    11 } else {
    12 print ("<BxCENTERxFONT COLOR=RED>Please enter the recipient's
    mail to address!</FONTx/CENTERx/B>\n") ; 13 }
    14 }
    15 ?>
    16 <FORM ACTION="email.php" METHOD=POST>
    17 Recipient's Email Address: <INPUT TYPE=TEXT NAME="MailTo"
    SIZE="50"xBR>
    18 Your Email Address: <INPUT TYPE=TEXT NAME="MailFrom" SIZE="50"xBR>
    19 Email Subject: <INPUT TYPE=TEXT NAME="Subject" SIZE="80"xBR>
    20 Email Body:<TEXTAREA NAME="Body" ROWS="10" COLS="50">
    21 </TEXTAREAxP>
    22 <INPUT TYPE=HIDDEN NAME=BeenSubmitted VALUE=TRUE>
    23 <INPUT TYPE=SUBMIT NAME="SUBMIT" VALUE="Submit!">
    24 </FORM>
    25 <?php
    26 require ("footer.php");
    27 ?>
  3. После строки 9 добавьте запись, данную ниже.
  4. error_log ("Unable to send an email to $MailTo from
    $MailFrom at " . timed. "\n", 3, "errors.txt");

    Каждый раз, когда функция mail (} не может быть выполнена, в файл жур нала записывается простое сообщение. Оно указывает, что $MailFrom не мо жет послать сообщение $MailTo в определенное время (заданное с помощью функции t ime ()). Опытный администратор может просмотреть этот файл и либо отследить пользователей, у которых возникли проблемы, либо опреде лить, когда функция mail ( ) перестала работать корректно.

  5. Сохраните сценарий как email.php (листинг 14.4) и загрузите его на Web сервер.
  6. Создадим пустой документ errors.txt, который будет исполнять роль прото кола ошибок.

  7. Создайте пустой документ в текстовом редакторе.
  8. Сохраните документ как errors.txt и загрузите его на сервер в один ката лог с email.php.
  9. Задайте такие права доступа к файлу errors.txt, чтобы все категории пользо вателей могли записывать данные в этот файл.
  10. Протестируйте email.php в браузере (рис. 14.514.7).
  11. Листинг 14.4 т В модифицированной версии сценария email.php функция error_log() используется для протоколирования любых проблем, возника ющих при отправке электронной почты. Допустимо использовать функцию error_log ( ) , чтобы получать сообщения об ошибке по электронной почте. Однако это становится невозможным, если отправить почту трудно или не уда ется.

    1 <?php
    2 $PageTitle = "Sending Emails";
    3 require ("header.php");
    4 if ($BeenSubmitted) {
    5 if ($MailTo) {.
    6 if (mail($MailTo, $Subject, $Body, "From: $MailFrom")) {
    7print ("<BxCENTERxFONT COLOR=BLUE>Your email has been
    successfully sent!</FONTx/CENTERx/B>\n") ;
    8} else {
    9 print ("<BxCENTERxFONT COLOR=RED>Your email was not
    successfully sent due to a system error!</FONTx/CENTER>
    </B>\n");
    10 error_log ("Unable to send an email to $MailTo from
    $MailFrom at " . time(). "\n", 3, "errors.txt");
    else
    11}
    12print (."<BxCENTERxFONT COLOR=RED>Please enter the recipient's
    13mail to address! </FONTx/CENTERx/B>\n") ;
    14 }
    15 }
    16 ?>
    17 <FORM ACTION="email.php" METHOD=POST>
    18 Recipient's Email Address: <INPUT TYPE=TEXT NAME="MailTo"
    ' SIZE="50"xBR>
    19 Your Email Address: <INPUT TYPE=TEXT NAME="MailFrom" SIZE="50"xBR>
    20 Email Subject: <INPUT TYPE=TEXT NAME="Subject" SIZE="80"xBR>
    21 Email Body:<TEXTAREA NAME="Body" ROWS="10" CObS="50">
    22 </TEXTAREAxP>
    23 <INPUT TYPE=HIDDEN NAME=BeenSubmitted VALUE=TRUE>
    24 <INPUT TYPE=SUBMIT NAME="SUBMIT" VALUE="Submit!">
    25 </FORM>
    26 <?php
    27 require ("footer.php");
    28 ?>


Если прикладная программа электронной почты на сервере работает корректно, этот сценарий ничего не запишет в файл протокола. Если вы хотите посмотреть, что сделает сценарий, если не сможет отправить сообщение, измените строку 6 на следующую:
if (imail($MailTo,$Subject,$Body,"From:$MailFrom")){