簡體   English   中英

PHP / FastCGI錯誤500

[英]PHP/FastCGI Error 500

我有一個PHP腳本,它花費很長時間並且建立了許多數據庫連接。

大約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上進行了搜索,發現明顯的答案是更改域的“ fcgi-bin / php5.fcgi”文件中的“ PHP_FCGI_MAX_REQUESTS”變量或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並在所有崩潰之前觸發“重新運行”功能。

我認為這是因為您的腳本沒有向apache發送任何數據。 由於由於等待來自fast-cgi的apache的響應超時而導致出現此錯誤。 我在nginx + php-fpm上有類似的問題。 我已經通過以下解決方法解決了它:

function explicitBufferFlush()
{
    echo str_repeat('*', 1024 * 64);
    flush();
    ob_flush();
}

它所做的只是將*發送到輸出,並且在腳本運行時apache會接收數據,並且不會斷開連接。 您可以在重循環或其他任何循環的每次迭代中調用它。 或者,您可以嘗試將FcgidIOTimeout指令設置為.htaccess中的某個較高值

很抱歉,問了這么長時間后才遇到這個問題,您可能已經解決了這個問題,但是由於我以前曾遇到過這個問題,所以我想我會把這個問題丟給所有正在尋找的人...

通常,FastCGI進程的超時為5分鍾。 最有可能是您收到此錯誤,因為FastCGI在5分鍾后中止,從而阻止了它向Apache發送任何輸出。 嘗試將超時時間增加到10分鍾,或大幅度減少正在執行的處理,以證明是這種情況。

FastCGI進程超時與PHP超時的不同之處在於,它是對進程啟動以來的時間的簡單計算,而不是PHP超時所基於的進程中的時間。 (換句話說,等待數據庫響應所花費的時間不會計入PHP超時,但會計入FastCGI超時。因此,即使PHP設置了較短的超時,您仍然可以先達到FastCGI超時。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM