我有一个在 IIS 7.5 上运行的 php 应用程序,以 fastcgi 运行的 php 5.4 。该应用程序工作绝对正常,除了长时间运行的 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 终止一样,那么没有任何内容返回到浏览器,您会得到什么就浏览器而言看起来像是挂起?
fastcgi
activity timeout=800 Idle Timeout = 900 request Timeout 800
Php
max_execution_time=700
如果长时间运行的脚本不与浏览器通信,则在 180 秒左右之后,大多数浏览器将对服务器返回结果无响应。服务器脚本没有挂起或被终止,而是浏览器(即 ff 和 chrome)变得无响应。
为了检查这一点,我运行了脚本并观察了请求的状态。
IIS 管理器 -> 选择服务器 -> 选择工作进程(中央窗格) -> 选择应用程序池 -> 选择查看请求(右侧窗格)并观察状态和已用时间列。您必须重复单击“显示全部”才能看到值更新。
状态从 ExecuterequestHandler 更改为正在发送响应,然后脚本按预期完成,但浏览器看起来仍然在等待服务器响应。
我将上面的测试脚本更新为以下内容,以确保浏览器定期收到响应:
<?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 提供的说明将 ResponseBufferLimit 设置为 0PHPlush在IIS7.5中停止刷新 https://stackoverflow.com/questions/7178514/php-flush-stopped-flushing-in-iis7-5
这解决了问题:)如果这个解决方案对您有帮助,请访问上述问题并给达里奥另一个+1,也许还有一个给OP的问题和脚本。
Thanks
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)