PHP 預設為請求-回應模式,腳本執行時間受限於 max_execution_time,且用戶關閉瀏覽器即中止。若需實作背景長時間任務(如資料同步、報表產生、定期清理),可透過 ignore_user_abort() 與 set_time_limit(0) 突破限制,配合無限迴圈與 sleep() 達到排程效果。
<?php
/*
|---------------------------
| PHP 定時任務範例
|---------------------------
*/
ignore_user_abort(true); // 用戶斷線不中止腳本
set_time_limit(0); // 移除執行時間限制
do {
$fp = fopen('auto.txt', 'w');
if ($fp) {
$text = "你好\n\r";
$count = 0;
for ($i = 1; $i < 10; $i++) {
$line = '第' . $i . '行:' . $text;
if (! $c = fwrite($fp, $line)) {
echo '第' . $i . '次寫入失敗!';
}
$count += $i;
}
fclose($fp);
}
sleep(60); // 暫停 60 秒
} while (true);
| 函數 | 作用 | 注意事項 |
|---|---|---|
ignore_user_abort(true) | 用戶關閉瀏覽器/斷線時,腳本繼續在背景執行 | 預設 false;若設 true,腳本成為孤兒進程,需自行管理結束條件 |
set_time_limit(0) | 移除 max_execution_time 限制 | 0 代表無限制;若 php.ini 設 max_execution_time 為硬性限制則無效 |
sleep(秒數) | 暫停腳本執行指定秒數 | 單位為秒;usleep() 為微秒 |
error_log() 記錄執行狀態、例外捕捉。flock() 檔案鎖或 PID 檔確保單一實例運行。gc_collect_cycles() 或重啟腳本。利用 ignore_user_abort + set_time_limit(0) + sleep 可快速實作簡易背景任務,適合開發測試或極簡場景。正式專案強烈建議採用作業系統級排程或訊息佇列架構,確保穩定性、可觀測性與可維護性。