PHP捕获FATAL级别错误

官方参考资料

官方网站 set_error_handler register_shutdown_function

如何完美捕获所有错误

set_error_handler可以用于捕获大多数的错误类型,当碰到FATAL级别的错误时,由于PHP直接终止运行了,所以无法触发set_error_handler设置的回调函数。这时候我们就需要使用register_shutdown_function来设置程序终止的回调函数。需要注意的是register_shutdown_function设置的回调是在程序运行终止后执行的,无论过程中是否出现错误都会执行。所以在这个回调中我们还需要先判断是否产生了错误,如果有产生错误我们再把它记录到日志中。具体可以参考下面的代码。

            set_error_handler('exception_handler');
register_shutdown_function('shutdown_handler');
function exception_handler($err_no, $err_str, $err_file, $err_line)
{
    error_reporting(0);
    // save error log
    // ...
    error_reporting(E_ALL);
}
function shutdown_handler()
{
    $error = error_get_last();
    if (empty($error)) {
        return;
    }
    error_reporting(0);
    // save error log
    // ...
    error_reporting(E_ALL);
}