Php

PHP 在 60 秒後停止基於 Web 的腳本

  • May 9, 2019

我正在使用 Apache2 和 PHP (5.6) 的 Bitnami 安裝,我們遇到了一個腳本需要超過 60 秒才能完成的問題。

該腳本在 60 秒後失敗,發送 504 錯誤。

我已經檢查了所有其他可能性,但它一直回到執行時間。

if(round($mem_usage/1048576,2) > 36)
{
   echo "exceded 36mb, aborting<br>";
   echo "element: ".$fila." of ".mysql_num_rows($result)."<br>";
   echo "memory usage: ".round($mem_usage/1048576,2)."M <br>";
   echo "memory limit: ".ini_get('memory_limit')." <br>";
   echo "max_execution_time: ".ini_get('max_execution_time')."<br>";
   $time_end = microtime(true);
   $time = $time_end - $time_start;
   echo "time elapsed: ".ceil($time)." seconds";

   exit();
}

記憶體值總是在正常範圍內(我們增加了記憶體限制以防萬一),但是每當時間流逝 60 秒時腳本都無法列印此消息,因此我們丟棄了記憶體使用情況。

我在 StackExchange 問題中進行了很多搜尋,並編制了此問題的常見答案列表:

  • max_execution_time

我們嘗試將其增加到 300,但是沒有效果。PHP 似乎忽略了這個值,已經檢查了 php_info() 以防萬一它沒有設置,但它是。

  • 記憶體限制

見上文,RAM 使用率保持在正常範圍內。不是崩潰的原因。

  • 嘗試{}catch(){}

腳本停止,並且不執行 catch 塊內的程式碼。

  • 檢查錯誤日誌

PHP 沒有向錯誤日誌拋出任何東西,它只是突然終止腳本並且沒有任何輸出,我們已經檢查了 php.ini 中的日誌選項

  • 設置時間限制()

此方法返回 FALSE,根據文件,這意味著它無法設置新的時間限制,安全模式是這種情況發生的常見原因,這導致我們進入下一步

  • 安全模式

根據文件,這是 PHP5.6。

This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.
  • 最大輸入時間

我們將其設置為 300,沒有效果。

  • default_socket_timeout

同上

  • 檢查 .htaccess 的相關配置

完成了,我們什麼也沒找到。

  • 在 Apache 配置中設置超時

我們的 Apache 配置中沒有 Timeout 選項,添加後它沒有任何效果。

  • 我在答案中得到了更多建議,所以我在這裡添加它們。

這對於某些 PHP 腳本是不可能的,但是您是否嘗試過從命令行而不是通過 HTTP 請求執行腳本?這將排除是否有 Apache 或 PHP-FPM 配置搞砸了。

此腳本無法在 CLI 中執行,但執行虛擬腳本會導致無限期執行,因此 CLI 不會停止執行。

您在 PHP-FPM 配置中是否為 max_execution_time 或 request_terminate_timeout 設置了任何內容?

request_terminate_timeout 設置為 300,無效。php_admin_value

$$ max_execution_time $$設置為300,沒有效果。(根據文件,必須以這種方式設置)

您在 Apache 配置中是否為 LimitRequestBody 設置了任何內容(或任何其他限制)?

未在任何地方設置,Apache 配置中也沒有其他相關限制。

發生這種情況時您是否正在執行文件上傳?如果是這樣,您是否在 PHP 配置中檢查了 upload_max_filesize 和 post_max_size ?

此請求中未進行文件上傳,因此這些限制在此特定情況下無關緊要。

根據瀏覽器獲得不同的響應是沒有意義的,除非您在 PHP 中進行某種瀏覽器檢測並讓您的應用程序在此基礎上表現不同。如果您不這樣做,並且您可以始終確認這種相關性,那麼您可以做的一件事是查看兩個不同的瀏覽器是否出於某種原因發送不同的請求。

顯然這是 Firefox 顯示錯誤的方式,使用網路中的開發者控制台顯示 504 與 Chrome 中的相同(當我意外輸入 503 時,我問這個問題時犯了錯誤。)

你試過 ignore_user_abort(true)

剛剛啟用了 ignore_user_abort(通過 PHP-FPM 設置)。它沒有任何效果。

和/或試圖通過 register_shutdown_function() 擷取一些診斷資訊?

嘗試註冊關閉函式沒有任何效果,因為程式碼塊永遠不會執行。


最後一點,這個伺服器有 PHP-FPM,這就是我們設置 PHP 配置的地方,但是我們所做的任何事情都沒有任何效果,並且有問題的腳本在 60 秒後仍然終止。

對此問題的任何幫助將不勝感激。

您是直接訪問 apache 伺服器還是通過負載均衡器或代理訪問?

OP 中的這條評論讓我意識到我們正在使用 AWS 負載均衡器。檢查文件後,我們看到它的預設空閒超時時間為 60 秒。

增加此限制允許腳本優雅地完成。

需要檢查的一些額外事項:

  • 這對於某些 PHP 腳本是不可能的,但是您是否嘗試過從命令行而不是通過 HTTP 請求執行腳本?這將排除是否有 Apache 或 PHP-FPM 配置搞砸了。
  • 您是否為PHP-FPM 配置max_execution_timerequest_terminate_timeout在您的 PHP-FPM 配置中設置了什麼?
  • LimitRequestBody在 Apache 配置中是否設置了任何內容(或任何其他限制)?
  • 發生這種情況時您是否正在執行文件上傳?如果是這樣,您是否檢查upload_max_filesizepost_max_size在您的 PHP 配置中?
  • 根據瀏覽器獲得不同的響應是沒有意義的,除非您在 PHP 中進行某種瀏覽器檢測並讓您的應用程序在此基礎上表現不同。如果您不這樣做,並且您可以始終確認這種相關性,那麼您可以做的一件事是查看兩個不同的瀏覽器是否出於某種原因發送不同的請求。

引用自:https://serverfault.com/questions/966575