Как отправлять PHP Fatal Errors только?
Я занимаюсь разработкой довольно большого количества кода. Кроме того, он содержит множество общих предупреждений и уведомлений, которые не влияют на выполнение кода (т.е.: undefined varilables или ключи массива без qoutes).
Я хочу написать функцию, которая позволяет мне сначала сосредоточиться на фатальных ошибках, а затем я открою ее для менее срочных предупреждений и уведомлений. Я нашел этот код, но он отправляет каждое уведомление о предупреждении и ошибке.
http://net.tutsplus.com/tutorials/php/quick-tip-email-error-logs-to-yourself-with-php/
Как я могу изменить этот код, поэтому он имеет дело только с такими вещами, как:
- фатальные ошибки синтаксиса
- undefined функции
- отказ включить файлы
Ответы
Ответ 1
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 (ошибки анализа, undefined функции и т.д.), вам необходимо записать это с помощью register_shutdown_function
, как указано в соответствующем вопросе:
Ответ 2
Инициировать следующую функцию внутри вашего php файла.
register_shutdown_function('mail_on_error'); //inside your PHP скрипт
/** 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 protected]',$name_reciever='', 'text/plain');
}// end fatal_error_structure
Ответ 3
В качестве альтернативы вы можете использовать (если у вас есть доступ к оболочке) оболочку наблюдателя журнала script. Это позволяет поймать любую ошибку, включая ошибки синтаксического анализа (которые вы не можете поймать с помощью 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: [email protected]"
echo "To: [email protected]"
echo "Subject: PHP Error"
echo $LINE
) | sendmail -t
fi
done
Это более безопасно, потому что это просто побочный процесс и позволяет вам полагаться на другие технологии (оболочка script или что-то еще), в случае, если ошибки происходят из-за самой среды php, вы все равно будете уведомлены.
Ответ 4
Взгляните на this
Если вы хотите установить сообщение об ошибке примерно на
error_reporting(E_ERROR | E_PARSE | E_NOTICE | E_COMPILE_WARNING | E_COMPILE_ERROR);
Тогда надежда была бы в том, что она поднимет вышеупомянутые проблемы.