ignore_user_abort(bool $enable = true): int
設置客戶端斷開連接(關閉瀏覽器、網絡中斷)時,腳本是否繼續執行。返回值為舊設置(0/1)。
<?php
ignore_user_abort(true); // 關鍵:啟用斷開繼續執行
set_time_limit(0); // 移除最大執行時間限制 (需 php.ini 允許)
$file = '/tmp/ignore_user.txt';
if (!file_exists($file)) file_put_contents($file, '');
$fp = fopen($file, 'ab'); // 追加二進制模式
if (!$fp) exit("無法打開文件: $file");
for ($i = 0; $i < 100; $i++) {
$time = date('Y-m-d H:i:s');
echo "$time\n"; // 如未斷開連接,可見輸出
if (fwrite($fp, "$time\n") === false) {
fclose($fp);
exit("寫入失敗: $file");
}
echo "寫入完成: $time\n";
sleep(2);
}
fclose($fp);
echo "任務結束\n";
| 場景 | 說明 |
|---|---|
| 大數據導出 (Excel/CSV/PDF) | 用戶點擊導出,頁面提示「正在後台生成,稍後下載」,腳本持續寫文件 |
| 視頻/音頻轉碼 | 上傳後啟動 ffmpeg 長時間轉碼,不因用戶關頁中斷 |
| 批量郵件/推送發送 | 循環發送數萬條,耗時數分鐘 |
| 定時任務觸發器 | Web 請求觸發長時間運行的維護腳本 |
| 數據同步/ETL | 跨系統大量數據同步 |
logrotate 管理輸出日志,防止磁盤爆滿。gc_collect_cycles()、釋放大變量 unset()。| 維度 | ignore_user_abort (Web 觸發) | 隊列 Worker (CLI) |
|---|---|---|
| 可靠性 | 低 (Web 服務器重啟/超時會殺死) | 高 (進程管理器守護、自動重啟) |
| 併發控制 | 難 (受 PHP-FPM 進程數限制) | 靈活 (Worker 數獨立配置) |
| 監控運維 | 困難 (混雜在 Web 日志中) | 清晰 (獨立日志、指標、告警) |
| 部署複雜度 | 低 (無新增組件) | 中 (需隊列、Worker、監控) |
| 推薦場景 | 極簡內部工具、臨時腳本、低頻任務 | 所有生產級異步任務 |
新項目直接上隊列 (Laravel Queue, Symfony Messenger, Hyperf, 自研)。
僅在**極簡環境、無法引入隊列組件、任務極低頻**時使用 ignore_user_abort 作為戰術補丁。