核心函式
ignore_user_abort(true):用戶關閉瀏覽器或斷線時,腳本繼續在背景執行。
set_time_limit(0):移除最大執行時間限制(預設 30 秒),允許長期運行。
sleep($seconds):暫停指定秒數,控制執行間隔。
基本範本
<?php
ignore_user_abort(true);
set_time_limit(0);
$interval = 60 * 30; // 30 分鐘
do {
// === 這裡放入您的任務邏輯 ===
// 例:資料庫備份、快取重建、郵件發送、API 同步
// file_put_contents('cron.log', date('Y-m-d H:i:s') . " task run\n", FILE_APPEND);
sleep($interval);
} while (true);
部署方式
- 將腳本存為
cron_task.php 放在 Web 目錄外(安全)。
- 瀏覽器訪問一次
https://domain.com/cron_task.php 即啟動守護進程。
- 關閉瀏覽器,腳本持續在背景運行。
優缺點與替代方案
| 方案 | 優點 | 缺點 |
| PHP 死循環 + sleep | 部署簡單、無需系統權限、跨平台 | 佔用一個 PHP-FPM/Apache 進程、記憶體洩漏風險、單點故障、難以監控 |
| Linux Crontab | 系統級排程、精確、日誌完善、可並行 | 需 Shell 存取權、最小粒度 1 分鐘 |
| Systemd Timer / Supervisor | 進程管理、自動重啟、資源限制、依賴控制 | 需 Root 權限、設定較複雜 |
| 任務佇列 + Worker | 解耦、可擴展、重試機制、優先級 | 架構複雜、需額外基礎設施 |
生產環境建議
- 簡單、低頻、非關鍵任務:可用本文方法快速原型。
- 正式專案:強烈建議改用 Crontab 或 Supervisor 管理長期進程,並引入任務佇列 實現可靠的非同步處理。
- 若必須用 PHP 守護進程,請加入記憶體監控、錯誤捕獲、訊號處理 (
pcntl_signal) 並定期重啟。
結語
ignore_user_abort + set_time_limit(0) 提供了一種零配置的背景執行手段,適合原型開發與簡單維護腳本。生產系統請採用更健壯的排程與進程管理方案。
- 上一篇文章: PHP 實作 BigPipe 分塊輸出:優化首屏載入體驗
- 下一篇文章: PHP 關鍵字自動加超連結:長優先排序與二次替換策略
Copyright ©
程式碼之家 All Rights Reserved