PHP-обработчик ошибок журнала для вывода - PullRequest
0 голосов
/ 09 февраля 2012

У меня есть скрипт, который будет запускаться на сервере ежедневно для загрузки данных с ресурса без вывода HTML. По умолчанию PHP будет выводить ошибки моего скрипта в php_error.log и в окно вывода в NetBeans.

Я создал обработчик ошибок пользователя:

// user defined error handling function
function userErrorHandler($errno, $errmsg, $filename, $linenum, $vars) 
{
    error_log($errmsg, 3, "logs/aem.log");     
    switch ($errno) {
    case E_ERROR:
        exit("Error grave $errmsg at $filename:$linenum");
        break;
    case E_USER_ERROR:
        exit("Error grave $errmsg at $filename:$linenum");
        break;
    }
}

error_reporting(0);
set_error_handler('userErrorHandler');

Я включаю этот файл в свой основной скрипт, и все идет хорошо.

Во время разработки приложения я хотел бы продолжать видеть сообщения об ошибках на экране «Вывод» в Netbeans, а также сохранять файлы журнала ошибок (как это делает обработчик по умолчанию). Я попытался изменить значение error_reporting или добавить дополнительные функции error_log, используя следующие значения:

error_reporting(E_ALL | E_STRICT);
error_reporting(-1);
error_log($errmsg, 0);`

Но я никогда не получу ошибку на выходе, если не удалю include('mycustomhandler'); из файла.

Как мне эмулировать поведение стандартного обработчика ошибок?

1 Ответ

1 голос
/ 09 февраля 2012

Вы должны попытаться использовать выходные данные для stderr (я думаю, что netbeans его анализирует). Например:

fprintf( STDERR, "Normal error message %s\n", "With nested info");

Для регистрации ошибок вы можете использовать error_log() (возможно, будет обрабатывать вывод и для сетевых компонентов) или попытаться проанализировать error_log из php.ini (ini_get()).

Однако я полагаю, что php использует internaly syslog(). Поэтому ваш обработчик ошибок должен выглядеть так:

// Logging 
function userErrorHandler($errno, $errmsg, $filename, $linenum, $vars){
  $logLevel = 0;
  $label = '';
  $exit = false;

   switch( $errno){
     case E_ERROR:
     case E_USER_ERROR:
       $label = 'Critical error';
       $exit = true;
       $logLevel = LOG_ERR;
     break;

     // ...
   }

   $message = "$label: on line ... file, error string...";
   if( $logLevel){
     syslog( $logLevel, $message);
   }

   if( !ini_get( 'display_error') && $exit){
     die( 'Fatal error occured.');
   }

   if( $label){
      echo $message; // You're responsible for how error is displayed
   }

   if( $exit){
     die();
   }
}
error_reporting( E_ALL);

Задавайте вопросы в комментариях, если я не понял, что вы спрашивали

...