set_time_limit(int $seconds) 設定當前腳本最大執行秒數。0 表示無限制(直到完成或記憶體耗盡)。
<?php
// 設定 1000 秒上限
set_time_limit(1000);
// 無限制 (長時間任務、CLI 腳本常用)
set_time_limit(0);
?>
每次呼叫 set_time_limit() 會從零重新計時,而非累加:
<?php
// 預設 max_execution_time = 30 秒
// 腳本執行 25 秒後...
set_time_limit(20); // 現在剩餘 20 秒,總共可跑 25+20=45 秒
?>
| 環境 | 影響 | 解決方案 |
|---|---|---|
| 安全模式 (已移除 PHP 5.4+) | 無效 | 關閉安全模式或修改 php.ini |
| Web 伺服器 (Apache/Nginx + PHP-FPM) | 受限於 request_terminate_timeout | 調整 PHP-FPM 設定 |
| CLI 模式 | 預設無限制 (0) | 通常不需設定 |
| Windows IIS | 受限於 CGI Timeout | 調整 IIS 設定 |
<?php
set_time_limit(0); // 無限制
ini_set('memory_limit', '512M');
$pdo = new PDO(...);
$stmt = $pdo->query('SELECT * FROM large_table');
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
// 每筆處理重置計時器,防止單筆過久被殺
set_time_limit(30);
processRow($row);
}
?>
resize($img, 800, 600); $processor->watermark($img); }
運行時可用 ini_set() 覆蓋(若未被 disable_functions 限制)。
Web 請求不宜長時間執行,建議架構:
工具推薦:Laravel Queue、Symfony Messenger、PHP-AMPHP、Swoole Task。
set_time_limit(0),避免佔用 Worker 導致服務不可用memory_limit、max_input_time 綜合調整