set_error_handler() не работает для FATAL ошибки

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

он работает для всего, но не запускается для ошибки FATAL.

Любой способ решить эту проблему?

В настоящее время, чтобы обойти это обстоятельство, я зарегистрировал функцию выключения, которая проверяет error_get_last()

Ответ 1

Нет, это просто ограничение set_error_handler(); он не обрабатывает все ошибки.

Следующие типы ошибок не могут быть обработаны с помощью определенной пользователем функции: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING и большая часть E_STRICT, поднятых в файле где set_error_handler() вызывается.

register_shutdown_function() и error_get_last() является достойное обходное решение.

Ответ 2

Есть только хакерские способы его решения, например. используя register_shutdown_function(), а затем проверяя, произошла ли ошибка внутри этой функции.

PHP имеет log_errors по какой-либо причине, вы можете сделать PHP-журнал любой ошибкой в ​​syslog или в файле журнала без отдельной строки пользовательского кода, Поэтому использование set_error_handler() для этой цели вовсе не требуется, и его следует избегать, если вам не нужно, например. stacktrace.

Ответ 3

Как уже отмечали другие, мы можем использовать register_shutdown_function() и error_get_last() следующим образом.

Приведенная ниже реализация будет перехватывать ошибки, которые не \Throwable как проверено в php 7.1. Это должно работать и для предыдущих версий PHP. Он должен быть реализован только в вашей среде разработки (просто добавив его в конфигурационный файл разработки) и не должен выполняться в рабочей среде.

Реализация

register_shutdown_function(function () {
    $err = error_get_last();
    if (! is_null($err)) {
        print 'Error#'.$err['message'].'<br>';
        print 'Line#'.$err['line'].'<br>';
        print 'File#'.$err['file'].'<br>';
    }
});

Пример ошибки

Error# Class Path/To/MyService contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Path/To/MyServiceInterface::add)
Line# 12
File# Path/To/MyService.php