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

PHP 腳本最大執行時間設定與管理

     編輯:PHP 相關知識

預設限制

php.ini 預設 max_execution_time = 30 秒。超時會導致 Fatal error: Maximum execution time of 30 seconds exceeded。

三種修改方式

1. php.ini (全域、需重啟)

max_execution_time = 300 ; 5 分鐘

2. 程式碼中動態設定 (當前腳本生效)

<?php
ini_set('max_execution_time', 300); // 300 秒
ini_set('max_execution_time', 0);   // 0 = 無限制 (慎用)

// 保存原值,結束前恢復
$original = ini_get('max_execution_time');
ini_set('max_execution_time', 300);
// ... 長時間任務 ...
ini_set('max_execution_time', $original);
?>

3. 執行階段函數 set_time_limit()

<?php
set_time_limit(300); // 重設為 300 秒
set_time_limit(0);   // 無限制

// 累加模式:每次呼叫**重新計時** 300 秒
// 適合迴圈中定期呼叫防止超時
for ($i = 0; $i < 10000; $i++) {
    if ($i % 100 === 0) set_time_limit(30);
    // 處理資料...
}
?>

注意事項

  • 安全模式/CLI:CLI 模式下預設 max_execution_time = 0 (無限制),ini_set 可能受限於 disable_functions。
  • 系統呼叫/資料庫查詢/網路等待:預設**不計入**執行時間 (僅計算 CPU 時間)。若需包含等待時間,需在 php.ini 設定 max_execution_time 搭配 zend.max_execution_timing (PHP 7.4+) 或使用 pcntl_alarm。
  • Web 伺服器層逾時:Nginx fastcgi_read_timeout、Apache Timeout、Proxy proxy_read_timeout 可能先於 PHP 觸發 504 Gateway Timeout。
  • 無限制風險:死迴圈會佔滿 CPU/記憶體導致服務掛掉,**測試階段務必設定具體秒數**。

長時間任務最佳架構

不要在 HTTP 請求中直接執行超過 30 秒的任務。應採用非同步佇列:

  1. HTTP 請求快速寫入任務到 Redis/RabbitMQ/Database 佇列,立即返回「已接收」。
  2. Worker 進程 (Supervisor 管理) 從佇列取出任務執行,無時間限制。
  3. 前端輪詢/WebSocket 獲取進度/結果。

除錯技巧

<?php
// 顯示剩餘時間
echo '剩餘秒數: ' . (ini_get('max_execution_time') - (time() - $_SERVER['REQUEST_TIME']));

// 註冊關閉函數記錄超時
register_shutdown_function(function() {
    $error = error_get_last();
    if ($error && $error['type'] === E_ERROR && strpos($error['message'], 'Maximum execution time') !== false) {
        error_log('SCRIPT TIMEOUT: ' . json_encode($error));
    }
});
?>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved