PHP / FastCGI错误500

时间:2015-04-21 14:44:37

标签: php error-handling fastcgi

我有一个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

我搜索了这一点,发现显而易见的答案是更改域中“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并在全部崩溃之前触发“重新运行”功能。

2 个答案:

答案 0 :(得分:0)

我认为这是因为你的脚本没有向apache发送任何数据。你得到这个错误是因为来自fast-cgi的apache等待响应的超时。我在nginx + php-fpm上有类似的问题。我用这个解决方法解决了它:

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

它的作用只是将*发送到输出,并且当您的脚本运行时,apache接收数据并且不丢弃连接。你可以在一些重循环或其他任何东西的每次迭代中调用它。或者您可以尝试将FcgidIOTimeout指令设置为.htaccess中的某个高值

答案 1 :(得分:0)

对不起,刚问完这个问题很久以后,你可能已经解决了这个问题,但是因为我之前遇到过这个问题,我想我会把它扔到那里寻找...

通常,FastCGI进程的超时时间为5分钟。很可能你得到错误,因为FastCGI在5分钟后中止,这阻止了它向Apache发送任何输出。尝试将超时时间增加到10分钟,或者大幅减少正在进行的处理,以证明情况属实。

FastCGI进程超时与PHP超时不同,因为它是对进程启动以来的时间的简单计算,而不是进程中的时间,这是PHP超时所基于的。 (换句话说,等待数据库响应所花费的时间不计入PHP超时,但它会计入FastCGI超时。因此,即使PHP具有较短的超时设置,您仍然可以首先达到FastCGI超时。)