我有一个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();