您现在的位置: 365建站网 > 365文章 > iis+php中刷新输出缓冲flush无效的解决方法

iis+php中刷新输出缓冲flush无效的解决方法

文章来源:365jz.com     点击数:435    更新时间:2023-03-20 07:26   参与评论

我在一次调试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);
}
?>


如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛

发表评论 (435人查看0条评论)
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
昵称:
最新评论
------分隔线----------------------------

快速入口

· 365软件
· 建站公司
· 杰创官网
· 建站工具

业务咨询

· 技术支持
· 服务时间:9:00-18:00
365建站网二维码

Powered by 365建站网 RSS地图 HTML地图

copyright © 2013-2022 版权所有 鄂ICP备17013400号-1