Как отправить по электронной почте только PHP фатальные ошибки? - PullRequest
14 голосов
/ 17 октября 2011

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

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

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

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

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

Ответы [ 4 ]

12 голосов
/ 17 октября 2011

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' );

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

4 голосов
/ 08 апреля 2014

Инициируйте следующую функцию в вашем 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
2 голосов
/ 03 сентября 2014

В качестве альтернативы вы можете использовать (если у вас есть доступ к оболочке) сценарий оболочки наблюдателя журнала. Это позволяет отследить любую ошибку, в том числе ошибки синтаксического анализа (которые нельзя отследить с помощью 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

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

1 голос
/ 17 октября 2011

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

Если вы хотите указать в сообщении об ошибке что-то вроде

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...