繁体   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