PHP输出缓冲区刷新的问题

时间:2014-08-08 08:38:47

标签: php buffer output-buffering

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

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

php.net的PHP手册中找到了相当多的内容后,我发现了李的评论说

  

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

     

特别是这意味着进一步列出了以下变通方法   在这里是无效的:

     

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

     

2)改变php.ini涉及设置output_buffer和/或   zlib.output_compression为0或关闭;

     

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

     

所以,直到浏览器再次开始显示缓冲内容,提示   这里列出的是没有实际意义的。

see here

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

[编辑]

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

<?php
ob_implicit_flush(true);
ob_end_flush();

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

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

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

1 个答案:

答案 0 :(得分:0)

检查缓冲区大小并制作该大小的“空”假人,例如......

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

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

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