PHP刷新在IIS7.5中停止刷新

时间:2011-08-24 15:53:52

标签: php iis-7.5

我们一直在使用php flush一旦点击它就立即“空白”页面,并且还发送页面的导航和主要组件,以便几乎立即出现页面,即使有时内容可能会占用加载很长时间。

这一直很有效。

最近我们从IIS 7.0升级到7.5,现在flush不起作用。在调查问题时,我们已关闭静态和动态文件的压缩。我们还关闭了输出缓存。

我们还关闭了zlib压缩并在php.ini中输出缓冲。

为了测试问题,我们有以下脚本

@ini_set("output_buffering", "Off");
@ini_set('implicit_flush', 1);
@ini_set('zlib.output_compression', 0);

ob_start();

echo "starting...<br/>\n";
for($i = 0; $i < 5; $i++) {
    print "$i<br/>\n";
    ob_end_flush(); 
    ob_flush();
    flush();
    ob_start();
    sleep(2);
}
print "DONE!<br/>\n";

浏览器只显示加载状态(无论在任何浏览器中,在IE中它看起来像一个Ajax动画gif,在Firefox中,标签会说“正在连接......”)10秒,然后突然整个输出出现。

我们根据本网站上的类似问题尝试了flush和ob_flush以及ob_end_flush的各种组合。他们都没有工作。有没有办法让IIS / PHP刷新数据?

7 个答案:

答案 0 :(得分:28)

还有另一种使用IIS管理器设置响应限制的方法:

  1. 在服务器主页面的“管理”下,选择“配置编辑器”;
  2. 在“Section”下,输入'system.webServer / handlers';
  3. 旁边的“(收藏)”点击“...”或标记元素“(收藏)”,然后在“操作”和“收集”元素下,点击“编辑项目”;
  4. 向下滚动,直到您在“名称”下找到您的PHP版本;
  5. 在底部,显示属性可以手动编辑,包括responseBufferLimit,应该设置为0以使flush()工作。
  6. 大专业版是你可以编辑所有内容的属性,不仅PHP和你可以使用PHP的不同版本(甚至安装相同版本)。

    HTH

答案 1 :(得分:7)

您必须将所需处理程序的ResponseBufferLimit值设置为足够低以实际刷新的数字。我建议使用0,因为它可以防止IIS执行任何操作,但是传递从PHP脚本发送的内容。 您可以使用以下命令行将PHP处理程序的ResponseBufferLimit设置为0(只需将“NAME”更改为您要更新的处理程序的名称,例如PHP53_via_FastCGI):

appcmd.exe set config /section:handlers "/[name='NAME'].ResponseBufferLimit:0"

或者,您可以直接编辑applicationHost.config并在XML元素中添加ResponseBufferLimit属性。

答案 2 :(得分:4)

我所做的是使用以下功能:

function flush_buffers(){
    ob_end_flush();
    ob_flush();
    flush();
    ob_start();
}

所以在你的代码中:

ob_start();
flush_buffers();

echo "starting...<br/>\n";
for($i = 0; $i < 5; $i++) {
    print "$i<br/>\n";
    flush_buffers();
    sleep(2);
}

它应该完美无缺: - )


以下是一些工作代码(设置正确Content-Type):

<?php
header("Content-Type: text/html; charset=utf-8");
function flush_buffers(){
    ob_end_flush();
    ob_flush();
    flush();
    ob_start();
}

ob_start();
flush_buffers();
echo "starting...<br/>\n";
for($i = 0; $i < 60; $i++) {
    flush_buffers();
    print   "$i<br/>\n";
    flush_buffers();
    sleep(2);
}

flush_buffers();

print "DONE!<br/>\n";
?>

答案 3 :(得分:4)

在Powershell中以管理员身份输入以下命令:

C:\Windows\System32\inetsrv> .\appcmd.exe set config /section:handlers "/[name='PHP_via_FastCGI'].ResponseBufferLimit:0"

预期产出:

  

对“system.webServer / handlers”部分应用了配置更改   对于“MACHINE / WEBROOT / APPHOST”,在配置上传递它的路径   “机器/ WEBROOT / APPHOST”

有关更多背景信息,请查看:http://www.coastrd.com/cgioniis7

基本上,我们需要告诉FastCGI转换它的ResponseBufferLimit。这不能通过IIS管理控制台(仅检查7.5)

完成

答案 4 :(得分:2)

我参加派对有点晚了,但我想我会在web.config中添加如何做到这一点。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
        <!--- other stuff here --->
        <handlers>
            <remove name="ISAPI-dll" />
            <add name="ISAPI-dll" path="*.dll" verb="*" type="" modules="IsapiModule" scriptProcessor="" resourceType="File" requireAccess="Execute" allowPathInfo="true" preCondition="" responseBufferLimit="0" />
        </handlers>
    </system.webServer>
</configuration>

答案 5 :(得分:1)

由Web服务器决定是否对内容进行唠叨或通过分块编码发送内容。因此,虽然PHP可以要求服务器将数据推送到客户端,但它不能强制服务器使用分块编码。

This article建议您明确需要为IIS设置传输编码(请参阅有关ISAPI的信息)以便将数据发送到服务器 - 您可以在脚本中尝试相同的操作。

IME,这是一个问题的大多数情况可以通过......来更好地处理....

register_shutdown_function('do_slow_stuff');
....generate html content....
exit; // closes stdin/stdout, but shutdown fn will still be called 

function do_slow_stuff()
{
  ....
} 

答案 6 :(得分:0)

这是使用web.config执行此操作的另一种方法(@ Jules的方法对我来说不适用于IIS 8.0)。当然,您可能希望将PHP版本和路径替换为计算机上实际的版本和路径。

这允许使用服务器发送的事件!

<configuration>
    <system.webServer>
        <handlers>
            <remove name="PHP53_via_FastCGI" />
            <remove name="PHP54_via_FastCGI" />
            <remove name="PHP55_via_FastCGI" />
            <add name="PHP53_via_FastCGI" path="*.php" verb="GET,HEAD,POST" type="" modules="FastCgiModule" scriptProcessor="C:\Program Files (x86)\PHP\v5.3\php-cgi.exe" resourceType="Either" requireAccess="Script" allowPathInfo="true" preCondition="" responseBufferLimit="0" />
            <add name="PHP54_via_FastCGI" path="*.php" verb="GET,HEAD,POST" type="" modules="FastCgiModule" scriptProcessor="C:\Program Files (x86)\PHP\v5.4\php-cgi.exe" resourceType="Either" requireAccess="Script" allowPathInfo="true" preCondition="" responseBufferLimit="0" />
            <add name="PHP55_via_FastCGI" path="*.php" verb="GET,HEAD,POST" type="" modules="FastCgiModule" scriptProcessor="C:\Program Files (x86)\PHP\v5.5\php-cgi.exe" resourceType="Either" requireAccess="Script" allowPathInfo="true" preCondition="" responseBufferLimit="0" />
        </handlers>
    </system.webServer>
 </configuration>