PHP Trick: Catching fatal errors (E_ERROR) with a custom error handler

Следующие типы ошибок не могут быть обработаны через пользовательский обработчик ошибок: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and most of E_STRICT raised in the file where set_error_handler() is called. Возможное решение ловить fatal E_ERROR errors и через пользовательский обработчик и функции register_shutdown_function() and error_get_last():

set_error_handler('myErrorHandler');
register_shutdown_function('fatalErrorShutdownHandler');

function myErrorHandler($code, $message, $file, $line) {
  ...
}

function fatalErrorShutdownHandler()
{
  $last_error = error_get_last();
  if ($last_error['type'] === E_ERROR) {
    // fatal error
    myErrorHandler(E_ERROR, $last_error['message'], $last_error['file'], $last_error['line']);
  }
}
Ключевой момент — регистрирование пользовательского обработчика и вызов его системой при фатальной ошибке, в том числе out of memory errors. error_get_last() используется для определения почему произошла фатальная ошибка