函數原型
set_time_limit(int $seconds): bool
0:無限制(直到腳本結束或系統硬性限制)。
>0:最大執行秒數,每次調用重置計時器。
- 受
max_execution_time (php.ini) 影響;安全模式/CLI 下無效。
常見場景
- 大量數據匯入/匯出、報表生成。
- 視頻轉碼、圖片批次處理。
- 爬蟲、API 同步任務。
正確使用模式
<?php
// CLI 長腳本:建議無限制
set_time_limit(0);
// Web 端長任務:分批處理 + 定期重置
function batchProcess(array $items, callable $handler, int $batchSize = 100): void {
foreach (array_chunk($items, $batchSize) as $batch) {
set_time_limit(30); // 每批重置 30 秒
foreach ($batch as $item) {
$handler($item);
}
// 可選:flush 輸出進度,避免前端超時
echo "已處理 " . count($batch) . " 筆\n";
@ob_flush(); @flush();
}
}
// 範例:模擬 1500 筆寫入
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', 'pwd');
$items = range(1, 1500);
batchProcess($items, function($i) use ($pdo) {
$stmt = $pdo->prepare('INSERT INTO php (php) VALUES (?)');
$stmt->execute([$i]);
});
替代方案:更適合長任務的架構
| 方案 | 優點 | 適用場景 |
| CLI + Cron/Supervisor | 無時間限制、進程管理、日誌完善 | 定時任務、守護進程 |
| 任務佇列 | 異步、可重試、負載均衡、監控 | 高併發、長耗時、需即時響應 |
| Web + AJAX 輪詢/Server-Sent Events | 前端可顯示進度、不阻塞用戶 | 用戶觸發的長任務 |
注意事項
set_time_limit() 不影響 sleep()、資料庫查詢、外部命令執行時間(僅計算 PHP 解釋器 CPU 時間)。
- Windows 下 IIS CGI 超時 (默認 300s) 需在
fcgiext.ini 或應用程式池調整。
- Nginx + PHP-FPM:
request_terminate_timeout (pool) 與 fastcgi_read_timeout (nginx) 需同步調大。
- 記憶體洩漏會導致長腳本 OOM,定期
gc_collect_cycles() 或分批釋放大變量。