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

PHP ignore_user_abort 與 register_shutdown_function 進階應用詳解

     編輯:PHP 綜合知識

ignore_user_abort()

控制使用者中斷連線(關閉瀏覽器、點擊停止)時,PHP 腳本是否繼續執行。

int ignore_user_abort([int $setting])
  • 預設行為:使用者中斷連線 → 腳本終止執行。
  • ignore_user_abort(true) 或 ignore_user_abort(1):忽略中斷,腳本繼續在背景執行完畢。
  • 回傳值:之前的設定值(0=正常, 1=忽略中斷)。

常見應用場景

  • 長時間任務(匯出大量報表、發送大量郵件、影片轉碼)。
  • 確保關鍵邏輯(如訂單狀態更新、付款回調處理)不因使用者關閉頁面而中斷。

register_shutdown_function()

註冊一個函數,在 PHP 腳本執行結束(正常結束、die()、exit()、致命錯誤)時自動呼叫。

int register_shutdown_function(callable $callback, mixed ...$args)
  • 可註冊多個,依註冊順序執行。
  • 在 shutdown 階段無法輸出內容給瀏覽器(輸出緩衝已關閉),除非使用 ob_start() 捕獲。
  • 常用於:記錄執行時間、清理暫存檔、釋放資源、記錄錯誤日誌、發送監控通知。

結合範例:背景任務 + 完成通知

<?php
ignore_user_abort(true); // 使用者關閉頁面也繼續跑
set_time_limit(0); // 移除執行時間限制

register_shutdown_function(function() {
    // 腳本結束時執行(無論正常或異常)
    $log = "任務結束時間: " . date('Y-m-d H:i:s') . "\n";
    file_put_contents('/var/log/bg_task.log', $log, FILE_APPEND);
});

// 模擬長時間任務
for ($i = 1; $i <= 10; $i++) {
    sleep(2); // 做一些事
    file_put_contents('/tmp/task_progress.txt', "步驟 $i 完成\n", FILE_APPEND);
}

// 正常結束也會觸發 shutdown function
?>

connection_status()

取得目前連線狀態,回傳位元遮罩:

  • 0 (NORMAL) - 正常
  • 1 (ABORTED) - 使用者中斷
  • 2 (TIMEOUT) - 執行逾時

可搭配 ignore_user_abort() 判斷是否為背景執行模式。

注意事項

  • 背景執行時,$_SESSION 可能無法正常寫入(Session 鎖定機制),建議在長任務前呼叫 session_write_close() 釋放鎖。
  • Apache/mod_php 環境下,背景腳程仍佔用一個 worker process,高併發時需評估資源上限。
  • 現代架構建議改用訊息佇列 + Worker 機制,更穩健可擴展。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved