1

我们有一个 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 等。没有运气。

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

4

2 回答 2

3

请记住@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(准确地说是1024 字节,这是我们测试过的任何浏览器使用的最大缓冲区限制)的任何 HTML 文档,您都应该尽早指定字符编码。

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

<?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);
}
?>
于 2012-06-28T21:41:31.560 回答
1

我找到了解决我的问题的方法。出于某种原因添加该行

default_charset = "utf-8"

我的 php.ini 使它工作。我确认我删除了线路.. 冲洗没有工作。添加它,它工作。也许是因为它添加了额外的标头,为浏览器缓冲区提供了足够的空间。

于 2012-06-29T01:13:01.890 回答