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

PHP set_time_limit() 突破執行時間限制:長時間任務實戰指南

     編輯:PHP 綜合知識

函數原型

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前端可顯示進度、不阻塞用戶用戶觸發的長任務

注意事項

  1. set_time_limit() 不影響 sleep()、資料庫查詢、外部命令執行時間(僅計算 PHP 解釋器 CPU 時間)。
  2. Windows 下 IIS CGI 超時 (默認 300s) 需在 fcgiext.ini 或應用程式池調整。
  3. Nginx + PHP-FPM:request_terminate_timeout (pool) 與 fastcgi_read_timeout (nginx) 需同步調大。
  4. 記憶體洩漏會導致長腳本 OOM,定期 gc_collect_cycles() 或分批釋放大變量。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved