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);
}