1

我有一个在 IIS 7.5 上运行的 php 应用程序,php 5.4 作为 fastcgi 运行。该应用程序运行良好,但长时间运行的 php 脚本似乎挂起;没有 500 错误,它们似乎永远不会完成并将结果返回给浏览器。

我在下面编写了一个简单的测试脚本,以消除主应用程序中出现编程错误的可能性:

<?php
/* test timeout */
/*set_time_limit(110);*/
echo "Testing time out in seconds\n";
for ($i = 0; $i < 175; $i++) {
    echo $i." -- ";

    if(sleep(1)!=0)
    {
        echo "sleep failed script terminating"; 
        break;
    }
}

?>

如果我运行脚本超过 175 秒,它就会挂起。在此之下,它会将结果返回给浏览器。

这是我为 php 和 fastcgi 设置的超时参数。我还尝试将这些设置设置得非常低,以便获得各种超时错误并成功了,这让我得出结论,我缺少另一个设置......也许。

如果我的假设是错误的,请纠正我,但公平地说,如果脚本超时,浏览器会出现错误,好像脚本在完成之前被 IIS 杀死,那么什么都不会返回到浏览器,你会得到什么就浏览器而言,看起来像挂起?

快速cgi

activity timeout=800 Idle Timeout = 900 request Timeout 800

php

max_execution_time=700
4

1 回答 1

1

如果长时间运行的脚本无法与浏览器通信,则在 180 秒左右后,大多数浏览器将对服务器返回结果无响应。服务器脚本没有挂起或被终止,它是浏览器(即,ff 和 chrome)变得无响应。

为了检查这一点,我运行了我的脚本并查看了请求的状态。IIS 管理器-> 选择服务器-> 选择工作进程(中央窗格)-> 选择应用程序池-> 选择查看请求(右侧窗格)并查看状态和经过时间的列。您将不得不反复单击“显示全部”以查看更新的值。

状态从 ExecuterequestHandler 更改为 Sending response,然后脚本按原样完成,但浏览器看起来仍然在等待服务器响应。

我从上面更新了我的测试脚本,以确保浏览器定期收到响应:

<?php 
@ini_set("output_buffering", "Off");
@ini_set('implicit_flush', 1);
@ini_set('zlib.output_compression', 0);
@ini_set('max_execution_time', 800);


header( 'Content-type: text/html; charset=utf-8' );


echo "Testing time out in seconds\n";
for ($i = 0; $i < 600; $i++) {
    echo $i." -- ";

    if(sleep(1)!=0)
    {
        echo "sleep failed script terminating"; 
        break;
    }
    flush();
    ob_flush();
}

?>

输出没有像应有的那样返回到浏览器,问题仍然存在。

下一步,我查看了服务器上的响应缓冲。该设置被设置为一个非常高的数字,这意味着冲洗不起作用。所以我根据@Dario 在PHP flush 中提供的说明将 ResponseBufferLimit 设置为 0 在 IIS7.5 中停止刷新

这解决了问题 :) 如果此解决方案对您有所帮助,请访问上述问题,并请给 Dario 另一个 +1 的我,也许还有一个给 OP 的问题和脚本。

谢谢

于 2012-12-01T11:32:17.327 回答