我在一次调试PHP逐行输出时候,发现ob_flush和flush两个都失效了,通过phpinfo基本能判断php.ini的设置是正常的。
IIS中flush失效的解决方法:
您必须将所需处理程序的ResponseBufferLimit值设置为足够低的数字,以使其实际刷新.我建议使用0,因为它阻止IIS除了传递PHP脚本发送的内容之外,什么都不做. 您可以使用以下命令行将php处理程序的ResponseBufferLimit设置为0
appcmd.exe set config /section:handlers "/[name='NAME'].ResponseBufferLimit:0"
或者,您可以直接编辑applicationHost.config并在XML元素中添加ResponseBufferLimit属性
打开文件 C:\Windows\System32\inetsrv\config\applicationHost.config ,注意如果你的是64位系统,这个文件就必须用64位的编辑软件打开,32位的软件打开会提示文件不存在,就用系统自带的notepad记事本打开就可以了。找到下面这一段,加入红色的那段代码就行了,也就是php这个handler里面加上responseBufferLimit="0"。
或者网站目录下有一个web.config,如下:
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.webServer> <handlers> <remove name="ZZphpserver_phpFastCGI" /> <add name="ZZphpserver_phpFastCGI" path="*.php" verb="*" modules="FastCgiModule" scriptProcessor="D:\ZZphpserver\php7.3\php-cgi.exe" responseBufferLimit="0"/> </handlers> </system.webServer> </configuration>
Nginx中flush失效的解决方法:
发现Nginx中,有如下的设置:
fastcgi_buffer_size 128k; fastcgi_buffers 8 128k;
问题基本找到了,Nginx会缓冲PHP输出的信息,当达到128k时才会将缓冲区的数据发送给客户端,那么我们首先需要将这个缓冲区调小,比如:
fastcgi_buffer_size 4k; fastcgi_buffers 8 4k;
并且,必须禁用gzip
gzip off;
然后,在php中,在ob_flush和flush前,输出一段达到4k的内容,例如:
echo str_repeat(‘ ‘, 1024*4);
到此,PHP就可以正常通过ob_flush和flush逐行输出需要的内容了。
测试代码:
<?php echo str_repeat(' ' ,4096); for($i=0;$i<10;$i++) { echo $i; ob_flush(); flush(); sleep(1); } ?>
如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛