Как отправлять PHP Fatal Errors только?

Я занимаюсь разработкой довольно большого количества кода. Кроме того, он содержит множество общих предупреждений и уведомлений, которые не влияют на выполнение кода (то есть: неопределенные переменные или ключи массива без qoutes).

Я хочу написать функцию, которая позволяет мне сначала сосредоточиться на фатальных ошибках, а затем я открою ее для менее срочных предупреждений и уведомлений. Я нашел этот код, но он отправляет каждое уведомление о предупреждении и ошибке.

http://net.tutsplus.com/tutorials/php/quick-tip-email-error-logs-to-yourself-with-php/

Как я могу изменить этот код, поэтому он имеет дело только с такими вещами, как:

  • фатальные синтаксические ошибки
  • неопределенные функции
  • невозможность включения файлов

set_error_handler позволяет указать определенную пользователем функцию обработки ошибок для определения того, что делать с определенными (но только нефатальными) ошибками. Затем вы можете обрабатывать определенные типы ошибок любым способом, который вы считаете необходимым, например, уведомляя системного администратора по электронной почте или сохраняя его в конкретном файле журнала. См. PHP Doc для получения дополнительной информации.

Что касается вашего запроса, вы можете использовать следующий подход:

 function myErrorHandler($errno, $errstr, $errfile, $errline) { if (!(error_reporting() & $errno)) { // This error code is not included in error_reporting return; } switch ($errno) { case E_USER_ERROR: case E_ERROR: case E_COMPILE_ERROR: echo "<b>My ERROR</b> [$errno] $errstr<br />\n"; echo " Fatal error on line $errline in file $errfile"; echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n"; echo "Aborting...<br />\n"; emailErrorFunction($errno,$erstr,$errfile,$errline); exit(1); break; default: echo "Unknown error type: [$errno] $errstr<br />\n"; break; } /* Don't execute PHP internal error handler */ return true; } // Report all errors error_reporting(E_ALL); // User a custom error handler to print output set_error_handler( 'myErrorHandler' ); 

Поскольку эта обработка ошибок не работает для Fatal Errors (ошибки анализа, неопределенные функции и т. Д.), Вам необходимо записать это с помощью register_shutdown_function как описано в соответствующем вопросе:

  • Как поймать фатальную ошибку PHP

В альтернативном варианте вы можете использовать (если у вас есть доступ к оболочке) сценарий оболочки наблюдателя журнала. Это позволяет поймать любую ошибку, включая ошибки синтаксического анализа (которые вы не можете поймать с помощью register_shutdown_function).

 #!/bin/bash tail -f /path_to_error_log/php_error.log|while read LINE;do if grep -q "PHP (Parse|Fatal) error" <(echo $LINE); then ( echo "From: server@example.com" echo "To: me@example.com" echo "Subject: PHP Error" echo $LINE ) | sendmail -t fi done 

Это imho более безвредно, потому что это просто побочный процесс и позволяет вам полагаться на другие технологии (сценарий оболочки или что-то еще), в случае возникновения ошибок из-за самой среды php вы все равно будете уведомлены.

Выполните следующую функцию внутри вашего php-файла.

 register_shutdown_function('mail_on_error'); //inside your php script /** If any file having any kind of fatal error, sln team will be notified when cron will become fail : following is the name of handler and its type E_ERROR: 1 | E_WARNING: 2 | E_PARSE: 4 | E_NOTICE: 8 */ function mail_on_error() { global $objSettings; $error = error_get_last(); //print_r($error); if ($error['type'] == 1) { // update file path into db $objSettings->update_records($id=1,array('fatal_error' => json_encode($error))); $exception_in_file_path = __FILE__; fatal_error_structure($exception_in_file_path); }// end if }// end mail_on_error 

fatal_error_structure следует определить в каком-либо глобальном местоположении. подобный function.inc.php . Это отправит электронное письмо зарегистрированному пользователю.

 function fatal_error_structure($exception_in_file_path){ $subject = "FATAL: Cron Daemon has failed"; sln_send_mail(nl2br("Please check $exception_in_file_path, This cron having FATAL error."), $subject, 'email@address.com',$name_reciever='', 'text/plain'); }// end fatal_error_structure 

Взгляните на это

Если вы хотите, чтобы ваша ошибка сообщала о чем-то вроде

 error_reporting(E_ERROR | E_PARSE | E_NOTICE | E_COMPILE_WARNING | E_COMPILE_ERROR); 

Тогда надежда была бы в том, что она поднимет вышеуказанные проблемы.