我有一个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中的条目。
所以,直到浏览器再次开始显示缓冲内容,提示 这里列出的是没有实际意义的。
如果他是正确的,有没有其他方法可以用来显示脚本运行的进度?
[编辑]
看起来李可能是对的。我一直在做一些测试,这是一个问题的例子
<?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),但它仍然是相同的。
答案 0 :(得分:0)
检查缓冲区大小并制作该大小的“空”假人,例如......
$flushdummy="";
for ($i=0; $i<700; $i++) { $flushdummy=$flushdummy." "; }
$flushdummy=$flushdummy."\n";
然后,当需要输出时,将虚拟添加到输出,加上flush:
echo "here I am<br />", $flushdummy;
flush();
@ob_flush();