首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 定時任務實現方案:ignore_user_abort + sleep 循環 vs 系統 Crontab 對比

     編輯:PHP 相關知識

PHP 本身無內建定時器,常見兩種實現:**腳本內長運行循環** 與 **系統級 Crontab**。本文對比原理、優缺點、適用場景,並給出生產級建議。

方案一:腳本內循環 (ignore_user_abort + sleep)

<?php
ignore_user_abort(true);  // 瀏覽器關閉也繼續執行
set_time_limit(0);        // 移除 30s 執行限制

$interval = 24 * 3600;    // 每天執行一次
$nextRun  = time() + $interval;

while (true) {
    // 精確對齊間隔(避免執行時間漂移)
    $sleep = $nextRun - time();
    if ($sleep > 0) sleep($sleep);

    // 業務邏輯
    try {
        $pdo->exec("UPDATE blog SET updated_at = NOW()");
        // 記錄執行日誌
        error_log("[" . date('c') . "] Cron job executed.");
    } catch (Throwable $e) {
        error_log("[" . date('c') . "] Cron error: " . $e->getMessage());
    }

    $nextRun += $interval; // 下次執行時間
}

方案二:系統 Crontab (推薦生產環境)

# /etc/crontab 或 crontab -e (www-data 用戶)
# 每天凌晨 3:00 執行
0 3 * * * /usr/bin/php /var/www/html/cron/daily_update.php >> /var/log/cron/daily.log 2>&1

# 每分鐘檢查隊列
* * * * * /usr/bin/php /var/www/html/cron/queue_worker.php >> /var/log/cron/queue.log 2>&1

深度對比

維度腳本循環系統 Crontab
可靠性低:進程掛掉/重啟/部署即停止,無自動恢復高:系統服務保活,掛掉自動重啟,開機自啟
精確度受 sleep/執行時間漂移影響分鐘級精確,系統時鐘驅動
資源佔用常駐一個 PHP 進程佔用內存按需啟動,執行完釋放
日誌/監控需自建系統日誌 + 重定向極簡
併發控制需自行實現鎖防止重疊天然串行(同一命令不並發)
部署/版本控制代碼內耦合邏輯命令與代碼分離,CI/CD 友好
適用場景極簡項目、無系統權限、需亞秒級高頻輪詢**所有生產環境定時任務首選**

進階:長運行腳本的生存保障 (若必須用循環)

  1. Supervisor 托管:將 PHP 腳本作為守護進程,自動重啟、日誌輪轉、啟停控制。
  2. 心跳檢測:定期向 Redis 寫入時間戳,監控端檢測超時告警。
  3. 優雅關閉:捕獲 SIGTERM 信號,完成當前任務後退出:pcntl_signal(SIGTERM, fn() => $shutdown = true);。
  4. 單例鎖:flock($fp = fopen('/tmp/cron.lock', 'w'), LOCK_EX | LOCK_NB) 防止多實例。

現代最佳實踐:任務隊列 + Worker

將「定時觸發」與「具體執行」解耦:

  1. Crontab 每分鐘推送任務到 Redis/RabbitMQ (LPUSH queue:jobs '{"job":"daily_report"}')。
  2. 多個 Worker 進程消費隊列 (php worker.php queue:jobs),可水平擴展、失敗重試、優先級調度。
  3. 推薦框架:Laravel Queue、Symfony Messenger、Hyperf Task、PHP-AMQPLib。

**結論**:能用 Crontab 就不用循環;能用隊列就不用硬編碼邏輯。架構分層,才能應對業務增長。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved