PHP flush 和 WAMP 服务器

3

我无论如何都无法让PHP的flush函数在WAMP中正常工作。这里有一些示例代码,注释掉的是我尝试过的所有不同方法:

//apache_setenv('no-gzip', 1); // returns error that apache_setenv does not exist
//ini_set('zlib.output_compression',0);
//ini_set('implicit_flush',1);
//ob_end_clean();
//for ($i = 0; $i < ob_get_level(); $i++) { ob_end_flush(); }
//ob_implicit_flush(1);
set_time_limit(0);
echo "<pre>";
for ($i = 0; $i < 100; ++$i) {
    echo $i.' '.time().str_repeat(' ',256)."\n";
    //ob_flush(); // returns error without output buffering enabled
    flush();
    usleep(100000);
}

似乎无论我做什么,都会在一个巨大的块中获得所有结果。
编辑: 我已经将完全相同的代码上传到运行在cPanel / linux上的服务器上,在所有浏览器中都可以正常工作。 为什么我不能在本地WAMP服务器上正确地使其工作?

这是一个问题,我将不得不向WAMP开发人员寻求帮助。我刚刚安装了XAMPP,一切都按预期工作。 - Shea
我完全不知道那是什么,这是最奇怪的事情,但我已经重新安装了WAMP,现在一切都很好。所有的设置和模块都是一样的,肯定是WAMP里面的一个bug。我对此感到非常困惑。我知道我没有疯,而且我一直都做得很正确。 - Shea
我也遇到了同样的问题。你正在运行哪个版本的WAMP? - Jannie Theunissen
@JannieT 我已经完全卸载了WAMP,重新安装了最新版本,并且自那时以来我就没有遇到过这个问题。我目前正在使用的是WAMP 2.2E。 - Shea
谢谢!- 再加上一些额外的字符,以便我能够发表评论... - Jannie Theunissen
2个回答

3

flush() 可能无法覆盖您的 Web 服务器的缓冲机制,并且不会对浏览器中任何客户端缓冲产生影响。它还不会影响 PHP 的用户空间输出缓冲机制。这意味着,如果您正在使用,您将需要调用 ob_flush() 和 flush() 来刷新 ob 输出缓冲区。

一些服务器,特别是在 Win32 上,仍然会将脚本的输出缓冲直到终止之前,然后才将结果传输到浏览器。

Apache 的服务器模块(例如 mod_gzip)可能会进行自己的缓冲,这会导致 flush() 不会立即将数据发送到客户端。

甚至浏览器也可能在显示之前对其输入进行缓冲。例如,Netscape 缓冲文本直到收到行尾或外部标记的开始,并且在看到最外层表格的 </table> 标记之前不会呈现表格。

Microsoft Internet Explorer 的某些版本只有在接收到 256 字节的输出后才会开始显示页面,因此您可能需要在刷新之前发送额外的空格以使这些浏览器显示页面。

  • php.net

我不太理解这个。我甚至使用 str_repeat(' ', 256) 来尝试解决那个 256 字节的问题。我已经在 Firefox 9、Chrome 16 和 IE 9 中尝试了相同的代码。这是否意味着刷新在所有现代浏览器中都无法工作?肯定有一些服务器设置存在问题。 - Shea
也许当您的 usleep() 函数执行时,缓冲区会在此期间被填充/清空。 - Grigor

0

在 flush() 前尝试使用 ob_flush();


我甚至已经尝试过了,没有输出缓冲时会出错提示没有可输出的缓冲区。使用输出缓冲后,仍然会将所有内容合并成一个大块。 - Shea
@ob_flush; // 防止无输出警告 - zzapper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接