【问题标题】:PHP/FastCGI Error 500PHP/FastCGI 错误 500
【发布时间】:2015-04-21 14:44:37
【问题描述】:

我有一个 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 并在它全部崩溃之前触发“重新运行”功能。

【问题讨论】:

    标签: php error-handling fastcgi


    【解决方案1】:

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

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

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

    【讨论】:

    • 我已经在 main 函数中向 apache 发送了大量数据,这似乎不是问题所在。而且我无法在我的 .htaccess 文件中设置FcgidIOTimeout(或任何FcgidANYTHING),我立即收到错误500,并且在日志中:/my/path/to/website/.htaccess: FcgidIOTimeout not allowed here
    • @roberto06 在脚本处理数据时您是否收到任何输出到浏览器?
    • 不,由于未知原因,flush()ob_flush() 似乎无法在我的任何浏览器上运行(但它们在标准输出中运行)。
    • 你在main函数中间的某个地方试过exit吗?只是为了检查它是否会向浏览器返回一些东西
    • 您可以访问虚拟主机配置吗?在那里设置FcgidIOTimeout 指令
    【解决方案2】:

    对不起,这个问题被问了很久才遇到这个问题,你可能已经解决了这个问题,但是因为我以前遇到过这个问题,所以我想我会把这个问题扔给任何正在搜索的人。 .

    通常,FastCGI 进程的超时时间为 5 分钟。您很可能会收到错误消息,因为 FastCGI 在 5 分钟后中止,这会阻止它向 Apache 发送任何输出。尝试将超时时间增加到 10 分钟,或大幅减少正在进行的处理,以证明确实如此。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-09
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-27
      • 1970-01-01
      相关资源
      最近更新 更多