PHP输出缓冲区刷新的问题


Problems with PHP Output Buffer Flush

我有一个PHP脚本需要一段时间来处理,我想让网站在运行时显示它的进度。

我一直有问题显示输出缓冲区的内容,而PHP代码正在运行。我一直在尝试使用ob_implicit_flush(true), ob_end_flush()ob_flush(),但没有成功。

在php.net上查找了不少PHP手册之后,我看到了Lee的评论

截至2012年8月,所有浏览器似乎都显示要么全有要么全无缓冲的方法。换句话说,当php正在运行时,没有可以显示内容

特别地,这意味着进一步列出了以下变通方法下面这些都是无效的:

1) ob_flush (), flush()与其他输出的任何组合缓冲功能;

2)修改php.ini,包括设置output_buffer和/或zlib。output_compression为0或Off;

3)设置Apache变量,如"no-gzip"Apache_setenv()或通过.htaccess中的条目。

因此,在浏览器开始再次显示缓冲内容之前,提示

看到

如果他是正确的,我是否可以使用其他方法来显示脚本运行的进度?

[编辑]

看起来Lee可能是对的。我一直在做一些测试,这里是一个问题的例子

<?php
ob_implicit_flush(true);
ob_end_flush();
for ($i=0; $i<5; $i++) {
   echo $i.'<br>';
   sleep(1);
}
?>

应该显示0到4,中间有一秒。实际发生的情况是,站点等待5秒,然后立即显示0到4。它正在等待脚本完成,然后一次显示所有内容。

我有output_buffering = Off在我的php.ini文件,并尝试将其设置为1和4096(4096是4KB),它仍然做同样的。

检查缓冲区大小并创建该大小的"空" dummy,例如…

$flushdummy="";
for ($i=0; $i<700; $i++) { $flushdummy=$flushdummy."      "; }
$flushdummy=$flushdummy."'n";

然后,当需要输出时,将dummy添加到输出中,加上flush:

echo "here I am<br />", $flushdummy;
flush();
@ob_flush();