Перехват fatal error или Перехват неперехватываемых ошибок
Пример демонстрирует обработку ошибок на этапе выполнения программы на PHP. Особенность этого примера заключается в перехвате всего вывода на экран с помощью задания обработчика для функции ob_start(). Таким образом можно перехватить вывод ошибок, для которых стандартный обработчик вызван не будет.
// мы будем сами обрабатывать ВСЕ ошибки
error_reporting(E_ALL);
// определенная пользователем функция обработки ошибок
function userErrorHandler ($errno, $errmsg, $filename, $linenum, $vars) {
// дата и время для записи об ошибке
$dt = date("Y-m-d H:i:s (T)");
// определение ассоциативного массива строк ошибок
// на самом деле следует рассматривать только элементы 2,8,256,512 и 1024
$errortype = array (
1 => "Ошибка",
2 => "Предупреждение",
4 => "Ошибка синтаксического анализа",
8 => "Замечание",
16 => "Ошибка ядра",
32 => "Предупреждение ядра",
64 => "Ошибка компиляции",
128 => "Предупреждение компиляции",
256 => "Ошибка пользователя",
512 => "Предупреждение пользователя",
1024=> "Замечание пользователя"
);
// набор ошибок, для которого будут сохраняться значения переменных
$user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE);
$err = $dt." ".$errortype[$errno]." № ".$errno."\n";
$err .= $errmsg."\n";
$err .= "Вызов из ".$filename." строка № ".$linenum."\n";
ob_end_clean();
ob_start();
print_r($vars);
$v = "Переменные:".ob_get_contents()."\n";
ob_end_clean();
ob_start("error_callback");
// сохранить протокол ошибок и отправить его мылом
mail('error@htmlweb.ru', 'PHP error report', $err.$v, "Content-Type: text/plain; charset=windows-1251" ) or die("Ошибка при отправке сообщения об ошибке");
error_log($err."\n", 3, dirname(__FILE__) . "/log/error.log") or die("Ошибка записи сообщения об ошибке в файл");
}
function error_callback($buffer) {
// если на экран будет выведено сообщение о фатальной ошибке, мы его сможем обработать
if (preg_match("/<b>error</b>.*/",$buffer,$regs)) {
$regs[0] = date("Y-m-d H:i:s (T)")."\n".preg_replace("/<[/]?b(r /)?>/","",$regs[0])."\n";
mail('error@htmlweb.ru', 'PHP error report', $regs[0], "Content-Type: text/plain; charset=windows-1251" ) or die("Ошибка при отправке сообщения об ошибке");
error_log($regs[0], 3, dirname(__FILE__) . "/log/error.log") or die("Ошибка записи сообщения об ошибке в файл");
return "Ошибка, выполнение прервано";
}
else
return $buffer;
}
// Перехват вывода на экран
ob_start("error_callback");
// Перехват обработки ошибок
$old_error_handler = set_error_handler("userErrorHandler");
Перехват fatal error в PHP
Следующий пример позволяет назначить функцию-обработчик завершения любого PHP скрипта. Этот обработчик получит управление и при возникновении fatal error.
// Определяем новую функцию-обработчик fatal error.
function myShutdownHandler() {
if (@is_array($e = @error_get_last())) {
$code = isset($e['type']) ? $e['type'] : 0;
$msg = isset($e['message']) ? $e['message'] : '';
$file = isset($e['file']) ? $e['file'] : '';
$line = isset($e['line']) ? $e['line'] : '';
if($code>0)userErrorHandler($code,$msg,$file,$line,'');
}
}
register_shutdown_function('myShutdownHandler');
// вызываем ошибку:
$x = null;
$x->method();
userErrorHandler - процедура обработки ошибкок, описанная выше.
.
Прокомментировать/Отблагодарить