萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP set_time_limit() 設定腳本執行時間上限完整指南

函式用途

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 設定

實務應用場景

1. 大量資料匯入/匯出

<?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);
}
?>

2. 影片轉碼、圖片批次處理

resize($img, 800, 600);
    $processor->watermark($img);
}

3. 定時任務 / Cron Job

相關設定檔參數

運行時可用 ini_set() 覆蓋(若未被 disable_functions 限制)。

替代方案:長時間任務非同步化

Web 請求不宜長時間執行,建議架構:

  1. 前端發起請求 → 寫入任務佇列 (Redis/RabbitMQ/Database)
  2. 背景 Worker (Supervisor + PHP CLI) 消費佇列執行
  3. 前端輪詢/WebSocket 取得進度/結果

工具推薦:Laravel Queue、Symfony Messenger、PHP-AMPHP、Swoole Task。

除錯技巧

總結

  • Web 環境謹慎使用 set_time_limit(0),避免佔用 Worker 導致服務不可用
  • 長任務務必非同步化
  • CLI 腳本預設無限制,通常無需呼叫
  • 搭配 memory_limit、max_input_time 綜合調整
copyright © 萬盛學電腦網 all rights reserved