PHP 本質上是請求響應模型,無常駐記憶體機制,實現定時任務需突破此限制。本文系統梳理五類主流方案,從簡易阻塞到生產級排程,助你根據業務場景選擇最佳架構。
ignore_user_abort(true);
set_time_limit(0);
ini_set('memory_limit', '512M');
$interval = 60 * 30; // 30 分鐘
do {
// 任務邏輯
sleep($interval);
} while (true);
缺點:無法優雅停止、佔用常駐進程、記憶體洩漏風險高、單點故障。
// config.php 返回 1 執行、0 停止
$run = include 'config.php';
if (!$run) die('process abort');
改進:透過外部配置檔實現優雅停止,但仍存長時間運行風險。
$time = 15; $url = "https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; sleep($time); file_get_contents($url); // 觸發下一次執行
特點:每次請求獨立執行,規避 max_execution_time 限制,但依賴 HTTP 迴路,網路波動易中斷。
# 每小時執行 00 * * * * /usr/local/bin/php /home/john/myscript.php
# Lynx 文字瀏覽器 00 * * * * lynx -dump https://www.sf.net/myscript.php # cURL(每 5 分鐘) */5 * * * * /usr/bin/curl -o temp.txt https://www.sf.net/myscript.php # Wget(每 10 分鐘) */10 * * * * /usr/bin/wget -q -O temp.txt https://www.sf.net/myscript.php
優勢:穩定可靠、系統級管理、支援日誌、重試、並發控制、跨平台(Windows Task Scheduler 同理)。
雖非獨立方案,但常搭配上述方案調整執行環境:
ini_set('memory_limit', '64M');
ini_set('display_errors', 1);
ini_set('session.auto_start', 0);
ini_set('session.cache_expire', 180);
ini_set('session.use_cookies', 1);
ini_set('session.use_trans_sid', 0);
| 場景 | 推薦方案 | 關鍵考量 |
|---|---|---|
| 簡單內部維護、低頻任務 | Crontab + CLI | 零依賴、最高穩定性 |
| 需動態管理任務、Web 介面控制 | 資料庫驅動 + Worker 機制 | 需額外開發調度系統 |
| 跨伺服器分散式排程 | 專用排程框架 | 如 Laravel Scheduler、Celery、XXL-JOB |
| Windows 環境 | Task Scheduler + php.exe | 注意權限與環境變數 |
flock、Redis 分散式鎖)gc_collect_cycles()摒棄應用層阻塞迴圈,擁抱系統級排程器是 PHP 定時任務的正規軍之路。配合現代化監控與容器化部署,構建可觀測、可維運的排程體系。