PHP 本質是「請求-響應」模型,**不適合長駐進程**執行定時任務。本文對比純 PHP 循環、CLI + 系統 Crontab、工作隊列三種方案優劣與適用場景。
<?php
ignore_user_abort(true); // 客戶端斷開腳本繼續跑
set_time_limit(0); // 無限執行時間
do {
// 業務邏輯
file_put_contents('auto.txt', date('c') . "\n", FILE_APPEND);
sleep(60); // 延遲 60 秒
} while (true);
缺陷:
# /etc/crontab 或 crontab -e * * * * * www-data /usr/bin/php /var/www/html/artisan schedule:run >> /dev/null 2>&1
Laravel/Symfony/ThinkPHP 等框架內建**任務調度器**,在 Kernel.php 定義:
// Laravel Kernel.php
protected function schedule(Schedule $schedule) {
$schedule->command('emails:send')->hourly();
$schedule->job(new CleanupJob)->dailyAt('02:00');
$schedule->call(fn() => Cache::flush())->weekly();
}
優勢:系統級可靠性、日誌輪轉、並發控制、無需修改 PHP 代碼即可調整頻率。
// Laravel 延遲派發 ProcessPodcast::dispatch($podcast)->delay(now()->addMinutes(10)); // Symfony Messenger $bus->dispatch(new SendEmail($email))->delay(600); // 秒
| 場景 | 推薦方案 |
|---|---|
| 簡單定時備份、清理、報表 | Crontab + CLI |
| 需秒級精度、動態調度 | Swoole Timer / Workerman / RoadRunner |
| 異步發送郵件、推播、視頻轉碼 | 隊列 |
| 分布式多節點、高可用、可視化監控 | Laravel Horizon / Jenkins / GitLab CI / Airflow |
| 臨時測試、一次性腳本 | ignore_user_abort + sleep(僅開發機) |
php.ini(關閉 Xdebug、調大 memory_limit、啟用 OpCache)。flock()、Redis SETNX、數據庫唯一索引。pcntl_alarm、框架內建 Timeout。