AAA Главная
Примеры PHP Примеры JavaScript Примеры Ajax Примеры CSS,HTML

Перехват 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>Fatal 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 - процедура обработки ошибкок, описанная выше.


.

© Copyright 2008-2016 by KDG