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

长时间运行的php/fastcgi脚本挂起在IIS 7.5上,php,iis,iis-7.5,fastcgi,Php,Iis,Iis 7.5,Fastcgi,我有一个php应用程序在IIS7.5上运行,PHP5.4作为fastcgi运行。除了长时间运行的php脚本似乎挂起之外,该应用程序运行绝对正常;没有500个错误,它们似乎永远不会完成,并将结果返回到浏览器 我在下面编写了一个简单的测试脚本,以消除主应用程序中出现编程错误的可能性: <?php /* test timeout */ /*set_time_limit(110);*/ echo "Testing time out in seconds\n"; for ($i = 0; $i &l

我有一个php应用程序在IIS7.5上运行,PHP5.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;
    }
}

?>
Php


如果长时间运行的脚本不与浏览器通信,大约180秒后,大多数浏览器将对返回结果的服务器没有响应。服务器脚本没有挂起或终止,而是浏览器(ie、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提供的说明将ResponseBufferLimit设置为0

这就解决了问题:)如果这个解决方案对你有帮助,请访问上面的问题,并请给Dario另一个+1,或者给OP一个问题和脚本


谢谢

如果长时间运行的脚本无法与浏览器通信,180秒左右,大多数浏览器将对返回结果的服务器失去响应。服务器脚本没有挂起或终止,而是浏览器(ie、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提供的说明将ResponseBufferLimit设置为0

这就解决了问题:)如果这个解决方案对你有帮助,请访问上面的问题,并请给Dario另一个+1,或者给OP一个问题和脚本


谢谢

谢谢您对格式和标记j0k:)的帮助谢谢您对格式和标记j0k:)的帮助
<?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();
}

?>