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

时间:2012-11-23 12:36:19

标签: php iis iis-7.5 fastcgi

我有一个运行在IIS 7.5上的php应用程序,php 5.4作为fastcgi运行。该应用程序工作absolutley罚款,除了长期运行的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

1 个答案:

答案 0 :(得分:1)

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

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

状态从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();
}

?>

输出没有回到浏览器位购买位,因为它应该并且问题仍然存在。

下一步,我查看了服务器上的响应缓冲。设置设置为非常高的数字,意味着冲洗不起作用。所以我按照PHP flush stopped flushing in IIS7.5

中@Dario提供的说明将ResponseBufferLimit设置为0

这解决了问题:)如果这个解决方案已经帮助了你请访问上面的问题,请给Dario另外一个+1,请给OP一个问题和脚本。

由于

相关问题