PHP中的输出缓冲区不起作用

时间:2011-11-11 20:58:19

标签: php output-buffering

一段时间(连续几个晚上......)我一直在努力获得一个耗时的脚本来输出简单的点,所以我知道它仍在处理脚本。基本上它是一个cronjob,它将在每晚运行以更新memcache服务器中的缓存密钥。

无论我尝试什么,我都无法让PHP输出当前的缓冲区。我想要的是在处理脚本时发送echo'd点。我错过了什么让它工作?我还尝试了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()

3 个答案:

答案 0 :(得分:2)

您是否在浏览器中进行调试?如果是这样,输出缓冲可能不是问题。

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

flush()的手册页中提及:

  

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

     

即使是浏览器也可以在显示之前缓冲其输入。例如,Netscape缓冲文本,直到它收到行尾或标记的开头,并且它不会呈现表,直到看到最外面的表的标记。

     

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

在控制台中,使用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#example-124

http://pear.php.net/manual/en/package.console.console-progressbar.php#example-125