首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 捕獲 Fatal Error 的有效方法:register_shutdown_function

     編輯:PHP 綜合知識

Fatal Error (如記憶體耗盡、呼叫未定義函式) 會導致腳本立即終止,set_error_handler 無法捕獲 (僅支援 Notice/Warning)。解決方案:使用 register_shutdown_function 搭配 error_get_last()。

核心原理

  • 腳本結束前 (正常結束或 Fatal Error) 會呼叫註冊的 shutdown 函式。
  • 在 shutdown 函式中呼叫 error_get_last(),若回傳非 null 且 type === E_ERROR,即為 Fatal Error。
  • 可記錄日誌、發送通知、輸出友善錯誤頁面。

基本實作

function shutdownHandler() {
    $error = error_get_last();
    if ($error !== null && $error['type'] === E_ERROR) {
        // 記錄致命錯誤
        error_log("[FATAL] {$error['message']} in {$error['file']}:{$error['line']}");
        // 可選:輸出使用者友善頁面 (注意 headers 已送出限制)
        // echo '

系統發生錯誤,請稍後再試

'; } } register_shutdown_function('shutdownHandler');

進階:區分錯誤類型

function shutdownHandler() {
    $error = error_get_last();
    if ($error === null) return; // 正常結束

    $fatalTypes = [E_ERROR, E_CORE_ERROR, E_COMPILE_ERROR, E_PARSE];
    if (in_array($error['type'], $fatalTypes)) {
        // 記錄到檔案/資料庫/外部服務
        $log = sprintf(
            "[%s] %s in %s:%d\nStack: %s",
            date('c'),
            $error['message'],
            $error['file'],
            $error['line'],
            json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS))
        );
        file_put_contents('/var/log/php_fatal.log', $log, FILE_APPEND);
    }
}
register_shutdown_function('shutdownHandler');

應用場景

  • 記憶體耗盡 (Allowed memory size exhausted) 定位大量資料處理邏輯。
  • 生產環境無法重現的間歇性 Fatal Error 追蹤。
  • 整合至監控系統 (Sentry、Datadog、自建日誌平台)。

限制與注意

  • 無法 恢復執行,只能事後記錄/通知。
  • error_get_last() 僅回傳最後一個錯誤,多重錯誤可能遺漏。
  • 若 display_errors = Off,瀏覽器仍顯示白畫面,需自行輸出錯誤頁 (在 headers 未送出前)。
  • PHP 7+ 建議改用 Throwable 捕獲 Error 例外 (try { ... } catch (Throwable $e) { ... }),涵蓋更完整。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved