无法在 Windows 中获取 flush() 工作


Can't get flush() working in Windows

我们有一个 ubuntu 测试服务器,这个简单的脚本可以很好地工作,它每秒向浏览器输出一个数字

<?
    for ($i=0; $i<3; $i++) 
    {
        echo $i.'<br>';
        flush();
        sleep(1);
    }

但是在我的本地开发盒(Windows环境)上,我无法让它工作,它在3秒后输出所有内容。

我在本地机器上使用与测试服务器相同的 php 版本 (5.3.13) 和 apache (2.2.22) 版本。我已经镜像了php.ini和httpd.conf中的大多数设置。这是我设置的设置(与测试服务器相同)

output_buffering 0
zlib.output_compression = Off
zlib.output_compression_level = -1

我没有安装mod_gzip。

我什至尝试在我的盒子上安装一个 wamp,但它也不起作用。

我无法想象这是一个客户端(浏览器 - Firefox 13)问题,因为我使用完全相同的浏览器在测试服务器上查看脚本并且它工作正常

我尝试启用隐式刷新,执行ob_flush等,但没有运气。

有人对如何使其工作有任何想法吗?

请记住@Wrikken所说的,不建议这样做。

所以我在想,你所做的一切似乎都是对的。我复制了您的设置并尝试了。我遇到了同样的问题。我从命令行执行了脚本,它有效。

然后我不得不做最后一个测试,Wireshark。在前几个数据包之后,很明显服务器正在正确发送所有内容,因此它必须是浏览器的缓冲区。

所以我尝试在循环之前发送一些数据,你猜怎么着?成功了!

给你:

<?php
ini_set('output_buffering','off');
ini_set('zlib.output_compression', 0);
echo str_repeat(" ", 1024), "'n";
for($i=0;$i<6;$i++) {
      echo $i."<br />'n";
      ob_flush();
      flush();
      sleep(1);
}
?>

不确定您想到的应用程序,但这显然不是一个好主意,我强烈建议您研究其他选项。

更新:经过长时间的谷歌搜索,我找到了这个和这个

因为浏览器无法在不知道如何的情况下正确呈现页面 为了构造页面的字符,大多数浏览器会缓冲一定的 执行任何 JavaScript 或绘制页面之前的字节数

为避免这些延迟,应始终指定字符 对于任何大于 1 KB 的 HTML 文档,尽早编码 (准确地说,是 1024 字节,这是 使用的最大缓冲区限制 我们测试过的任何浏览器)。

所以我尝试先发送字符集而不是填充缓冲区:(它奏效了)

<?php
ini_set('output_buffering','off');
ini_set('zlib.output_compression', 0);
//echo str_repeat(" ", 1024), "'n";
header('Content-Type: text/html; charset=iso-8859-1');
//Note that it shoudn't matter which charset you send
for($i=0;$i<6;$i++) {
      echo $i."<br />'n";
      ob_flush();
      flush();
      sleep(1);
}
?>

那么,为什么它与第一台服务器一起工作,而不是第二台服务器呢?

很可能是因为您的第一台服务器正在发送带有标头的字符集,而第二台服务器没有。

但是,在您的情况下,我会进行以下更改

<?php
ini_set('output_buffering','off');
ini_set('zlib.output_compression', 0);
//Plain text MIME type since you'll use for logging purposes
//and if you run it from CLI, you can ignore the whole header line
header('Content-Type: text/plain; charset=iso-8859-1');
for($i=0;$i<6;$i++) {
      //No need to echo <br /> once you'll run it from CLI
      echo $i."'n";
      ob_flush();
      flush();
      sleep(1);
}
?>

我已经找到了解决问题的方法。添加该行的某些原因

default_charset = "utf-8"

对我的php.ini使它工作。我确认我删除了这条线..同花顺不起作用。添加了它,它起作用了。也许是因为它添加了额外的标头,为浏览器缓冲区提供了足够的标头。