PHP中的输出缓冲区无法工作


Output buffer in PHP won't work

一段时间(几个晚上…)我一直试图得到一个时间昂贵的脚本输出简单的点,所以我知道它仍在处理脚本。基本上,它是一个cronjob,它将每晚运行以更新memcache服务器中的缓存键。

无论我如何尝试,我都无法让PHP输出当前缓冲区。我想要的是在处理脚本时发送回声点。要让它工作,我还缺什么?我也试过flush()函数…并使用ini_set("output_buffering", 1024);

目前这是我的设置:

# clean all open buffers    
while(ob_get_level() != 0)
{
    ob_end_clean(); 
}
ob_start();
// Several loops, taking some minutes...
for( ..loopconditions ..){
echo ".";
ob_flush();
}
ob_end_clean()

您是在浏览器中调试这个吗?如果是这样,输出缓冲可能根本不是问题。

每个浏览器都有自己的缓冲区,并最终决定何时开始刷新。

手册页中提到的flush():

冲洗()……对浏览器中的任何客户端缓冲没有影响。

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

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

IIRC,如果您使用php-cgi,输出缓冲不起作用

在控制台中,使用PEAR Console_ProgressBar更容易。它会帮你的。

文档中的例子:

<?php
require_once 'Console/ProgressBar.php';
$bar = new Console_ProgressBar('[%bar%] %percent%', '=>', ' ', 80, 7);
//do some processing here
for ($i = 0; $i <= 7; $i++) {
    $bar->update($i);
    sleep(1);
}
echo "'n";
?>
[=======================================>                              ]  57.14%

更多示例见:

http://pear.php.net/manual/en/package.console.console-progressbar.php的例子- 124

http://pear.php.net/manual/en/package.console.console-progressbar.php的例子- 125