繁体   English   中英

长时间运行的php / fastcgi脚本在IIS 7.5上挂起

[英]Long running php/fastcgi script hangs on IIS 7.5

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

max_execution_time=700

如果长时间运行的脚本无法与浏览器通信,则在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询问他的问题和脚本。

谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM