ignore_user_abort() 允許腳本在用戶關閉瀏覽器、中斷請求後繼續運行,配合 set_time_limit(0) 可實現長時間後台任務、定時輪詢、數據同步等場景。但需注意:會佔用一個 PHP-FPM 進程,高併發下慎用。
int ignore_user_abort([bool $setting])
setting = true:忽略用戶斷開,腳本繼續執行。setting = false:用戶斷開則終止腳本(預設行為)。注意: PHP 只有在嘗試向客戶端發送輸出時才會檢測連接狀態,單純 echo 不保證發送,需配合 flush()。
<?php
ignore_user_abort(true);
set_time_limit(0); // 移除執行時間限制
$interval = 60 * 15; // 15 分鐘
do {
// 業務邏輯:數據同步、郵件發送、緩存刷新等
// doBusiness();
sleep($interval);
} while (true);
<?php
ignore_user_abort(true);
set_time_limit(0);
$interval = 10;
$stop = 1;
do {
if ($stop == 10) break;
file_put_contents('phpernote.com.php', 'Current Time: ' . time() . ' Stop: ' . $stop);
$stop++;
sleep($interval);
} while (true);
瀏覽器關閉後,文件仍每 10 秒寫入一次,驗證腳本持續運行。
| 維度 | 建議 |
|---|---|
| 進程管理 | 使用 Supervisor、Systemd 或 Cron 管理守護進程,避免單一請求佔用 FPM worker。 |
| 任務隊列 | 採用 Redis/RabbitMQ + Worker 消費模式,解耦觸發與執行,支持重試、優先級、分布式。 |
| 輸出控制 | 長運行腳本定期 flush()、寫日誌、更新心跳文件,便於監控存活狀態。 |
| 資源清理 | 循環內釋放大變量、關閉數據庫連接、gc_collect_cycles() 防內存洩漏。 |
| 優雅退出 | 捕獲 SIGTERM 信號,完成當前任務後退出,避免數據不一致。 |
ignore_user_abort() 是 PHP 早期實現「偽後台」的經典手段,理解其原理有助於掌握請求生命周期。現代項目建議遷移至專業任務隊列或常駐進程架構,獲得更穩健的可維護性與擴展性。