sleep() 讓腳本暫停指定秒數,常用於輪詢、定時任務、API 限流等場景。但長時間運行需注意 PHP 最大執行時間、資料庫連線保持、記憶體管理等問題。
<?php
echo date('H:i:s') . PHP_EOL;
sleep(10); // 暫停 10 秒
echo date('H:i:s') . PHP_EOL;
// 輸出間隔 10 秒
?>
預設 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 秒輪詢一次
}
?>
| 函數 | 精度 | 適用場景 |
|---|---|---|
sleep(sec) | 秒 | 一般延遲、輪詢間隔 |
usleep(usec) | 微秒 | 高頻率控制(<1 秒) |
time_nanosleep(sec, nsec) | 奈秒 | 精密計時、多媒體同步 |
time_sleep_until(timestamp) | 秒 | 固定時間點喚醒(如定時排程) |
php script.php > /dev/null 2>&1 & 避免 Web 超時。pcntl_signal)支援優雅停止。善用 sleep() 搭配適當設定,能快速實現簡易排程;複雜場景請升級為專業任務佇列架構。