我有一個PHP腳本,需要很長時間,並使許多DB連接。PHP/FastCGI錯誤500
約5分鐘後,服務器將我錯誤500和error_log中顯示以下內容:
(104)Connection reset by peer: mod_fcgid: error reading data from FastCGI server
(104)Connection reset by peer: mod_fcgid: ap_pass_brigade failed in handle_request_ipc function
我用Google搜索,發現這個明顯的答案是改變內部無論是「PHP_FCGI_MAX_REQUESTS」變量「 fcgi-bin/php5.fcgi「文件或者Apache配置文件中的」FcgidMaxRequestsPerProcess「變量,但是我不能執行其中的任何一個,因爲服務器承載多個網站,所有網站都運行FastCGI。
我試圖捕獲錯誤500,並與下面的PHP代碼重定向頁面:
register_shutdown_function('rerun');
$rerun = isset($_GET['rerun']) ? true : false;
main($rerun);
function main ($rerun=false) {
// Lots and lots of stuff
}
function rerun() {
if (error_get_last() != NULL) {
header('Location: http://www.example.com/myscript.php?rerun');
}
}
但它也不管用,我還是結了一個錯誤500
不任何人有任何想法如何解決這個問題? 要麼通過在本地聲明FastCGI變量(即僅用於本網站),或者最好是正確捕獲錯誤500並在所有崩潰之前觸發「重新運行」功能。
我已經在我的'main'函數中向apache發送了大量的數據,這似乎不成問題。我無法在我的.htaccess文件中設置'FcgidIOTimeout'(或任何'FcgidANYTHING'),我得到一個直接的錯誤500,並且在日誌中:'/my/path/to/website/.htaccess: FcgidIOTimeout不允許在這裏。 – roberto06
@ roberto06當腳本處理數據時,你是否收到任何輸出到瀏覽器? – Tony
不知道,原因不明,'flush()'和'ob_flush()'在我的任何瀏覽器上似乎都不起作用(但它們在stdout中工作)。 – roberto06