我们一直在使用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刷新数据?
答案 0 :(得分:28)
还有另一种使用IIS管理器设置响应限制的方法:
大专业版是你可以编辑所有内容的属性,不仅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>