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

PHP sleep() 實現定時執行與長時間任務處理指南

     編輯:PHP 綜合知識

sleep() 讓腳本暫停指定秒數,常用於輪詢、定時任務、API 限流等場景。但長時間運行需注意 PHP 最大執行時間、資料庫連線保持、記憶體管理等問題。

基本用法

<?php
echo date('H:i:s') . PHP_EOL;
sleep(10); // 暫停 10 秒
echo date('H:i:s') . PHP_EOL;
// 輸出間隔 10 秒
?>

關鍵設定:移除 30 秒執行限制

預設 max_execution_time = 30,長任務必須在腳本開頭設定:

<?php
set_time_limit(0); // 0 = 無限制,單位:秒
// 或 ini_set('max_execution_time', '0');
?>
注意:set_time_limit() 僅影響 PHP 解析器計時,sleep() 期間不計入執行時間(Windows 除外)。

資料庫長連線斷線問題

MySQL 預設 wait_timeout = 28800(8 小時),但 PHP-FPM 進程重用可能導致連線失效。解法:

  • 使用 mysqli::ping() 或 PDO::ATTR_TIMEOUT 檢測並重連。
  • 每次迴圈前執行 $mysqli->ping() || $mysqli->connect()。
  • 或改用短連線模式:用完即關閉,下次重新連線。

實戰範例:帶重連機制的長時間輪詢

<?php
set_time_limit(0);
$mysqli = new mysqli('localhost', 'user', 'pass', 'db');

for ($i = 0; $i < 360; $i++) { // 運行 1 小時
    // 確保連線存活
    if (!$mysqli->ping()) {
        $mysqli->close();
        $mysqli = new mysqli('localhost', 'user', 'pass', 'db');
    }

    // 執行任務邏輯
    $result = $mysqli->query("SELECT * FROM tasks WHERE status='pending' LIMIT 1");
    if ($row = $result->fetch_assoc()) {
        // 處理任務...
    }

    sleep(10); // 每 10 秒輪詢一次
}
?>

替代方案:usleep()、time_nanosleep()、time_sleep_until()

函數精度適用場景
sleep(sec)秒一般延遲、輪詢間隔
usleep(usec)微秒高頻率控制(<1 秒)
time_nanosleep(sec, nsec)奈秒精密計時、多媒體同步
time_sleep_until(timestamp)秒固定時間點喚醒(如定時排程)

生產環境建議

  • 長任務改用 任務佇列(Redis + Worker、Gearman、RabbitMQ)而非阻塞腳本。
  • CLI 模式運行:php script.php > /dev/null 2>&1 & 避免 Web 超時。
  • 加入訊號處理(pcntl_signal)支援優雅停止。

善用 sleep() 搭配適當設定,能快速實現簡易排程;複雜場景請升級為專業任務佇列架構。

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