控制使用者中斷連線(關閉瀏覽器、點擊停止)時,PHP 腳本是否繼續執行。
int ignore_user_abort([int $setting])
ignore_user_abort(true) 或 ignore_user_abort(1):忽略中斷,腳本繼續在背景執行完畢。註冊一個函數,在 PHP 腳本執行結束(正常結束、die()、exit()、致命錯誤)時自動呼叫。
int register_shutdown_function(callable $callback, mixed ...$args)
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
?>
取得目前連線狀態,回傳位元遮罩:
0 (NORMAL) - 正常1 (ABORTED) - 使用者中斷2 (TIMEOUT) - 執行逾時可搭配 ignore_user_abort() 判斷是否為背景執行模式。
$_SESSION 可能無法正常寫入(Session 鎖定機制),建議在長任務前呼叫 session_write_close() 釋放鎖。