萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP register_shutdown_function:腳本關閉時執行回調的完整應用指南

register_shutdown_function() 註冊的回調會在 PHP 腳本**正常結束**、**致命錯誤終止**、**執行逾時**或**用戶強制停止**時自動執行,是執行清理、記錄錯誤、釋放資源的最後防線。

語法與特性

register_shutdown_function(callable $callback, mixed ...$args): void
  • 可註冊多個,按註冊順序執行
  • 回調執行時腳本已進入關閉階段,**無法輸出內容給瀏覽器**(輸出緩衝已關閉)
  • 可用 error_get_last() 取得最後發生的致命錯誤
  • die()/exit() 仍會觸發 shutdown 函數
  • PHP 4 無解構函數時常用此模擬

實戰範例:捕獲致命錯誤並寫入檔案

<?php
header("Content-Type: text/html; charset=utf-8");

class Shutdown {
    public function endScript() {
        // 捕獲致命錯誤
        if ($error = error_get_last()) {
            echo "
";
            print_r($error);
            echo "
"; } // 絕對路徑寫入檔案(shutdown 時工作目錄可能已變更) file_put_contents(__DIR__ . '/error.txt', 'Script ended at ' . date('Y-m-d H:i:s')); die('腳本結束'); } } register_shutdown_function([new Shutdown(), 'endScript']); // 故意觸發致命錯誤 echo md6(); // 未定義函數

執行輸出

Fatal error: Call to undefined function md6() in ... on line 18
Array
(
    [type] => 1
    [message] => Call to undefined function md6()
    [file] => ...
    [line] => 18
)
腳本結束

檔案 error.txt 成功寫入。

三大典型使用場景

場景說明處理重點
用戶強制停止(瀏覽器關閉/停止按鈕)連線中斷觸發 shutdown檢查 connection_aborted(),避免繼續耗時運算
程式異常終止/逾時致命錯誤、max_execution_time 到期error_get_last() 記錄錯誤、釋放鎖/連線
PHP 4 模擬解構函數舊版專案相容在 shutdown 中釋放資源、關閉連線

關鍵限制與注意事項

  • 無法輸出 HTML:若需記錄,寫入檔案/資料庫/系統日誌
  • 工作目錄不確定:檔案操作**必須使用絕對路徑**(__DIR__、realpath())
  • 執行時間限制:shutdown 函數受 max_execution_time 限制,長時間清理可能被殺掉
  • 無法擲出例外:shutdown 階段拋出的例外不會被捕獲,會導致致命錯誤
  • FastCGI/FPM 模式:請求結束觸發,但進程可能重用,靜態變數殘留需注意

進階:關閉連線後繼續背景處理

ignore_user_abort(true); // 忽略用戶斷線,繼續執行
set_time_limit(0);       // 移除時間限制

register_shutdown_function(function() {
    // 這裡的程式碼會在回應已發送給瀏覽器後繼續執行
    // 適合:發送郵件、寫入日誌、異步任務觸發
    file_put_contents(__DIR__.'/bg.log', 'Background task done');
});

掌握 register_shutdown_function,能在 PHP 腳本生命週期的終點建立可靠的清理與監控機制。

copyright © 萬盛學電腦網 all rights reserved