Apache 和 FPM 連結因腳本逾時而中斷

Apache 和 FPM 連結因腳本逾時而中斷

我正在嘗試設定 Apache + PHP-FPM,但是,我們有一個長時間運行的腳本被執行並最終超時,這切斷了 Apache 和 FPM 之間的鏈接,最終導致整個網站癱瘓...

如果達到 --idle-timeout,是否有辦法防止整個網站崩潰?

FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -idle-timeout 18000 -pass-header Authorization

答案1

Apache 向 php-fpm 發出請求當達到超時時將被中止。對於用戶來說也是如此。如果您希望最終客戶得到回應,可以想到三種可能性:

  1. 增加你的超時值(因為你的 PHP 應用程式比這個慢)
  2. 嘗試讓您的 PHP 應用程式更快滿足該請求
  3. 讓您的 PHP 應用程式計算其所花費的時間,如果所花費的時間超過您的超時值,則以錯誤訊息回應

恕我直言,解決方案 #2 是開發人員通常的選擇。

答案2

長時間運行的腳本不應從瀏覽器/Apache 運行。您應該使用 PHP CLI 而不是 FPM 在背景運行它。 CLI 腳本不會逾時,也不會幹擾 Apache 操作。

您可以使用 cronjobs 安排腳本定期運行,也可以透過編寫臨時檔案之類的操作使其從瀏覽器觸發(例如,將一個名為的檔案放入run_script您的網站目錄中,然後在腳本末尾將其刪除) )在資料庫或其他後端設置標誌。

當採用第二種方式時,您仍然需要一個cronjob(可以每分鐘運行一次)來檢查此文件/資料庫條目是否存在,並在找到時觸發腳本(您還可以創建一個偵聽器來監視此文件/資料庫條目)不斷地而不是每分鐘一次,但這相當密集,並且對於大多數用例來說可能是過度的)。

一旦它被觸發,您發回給用戶的只是一條通知,例如「稍等,我們正在處理您的請求。請在幾分鐘後回來查看。」。這樣,他們也不需要保持瀏覽器開啟來保持請求運行,並且可以同時執行其他操作。

相關內容