PHP流/输出缓冲不再有效

时间:2015-01-08 19:22:23

标签: php output-buffering

我有一个曾经在PHP5.3中工作的脚本来处理特定日志文件的缓冲但是在服务器升级到PHP5.5后它不再有效。输出需要是html所以我希望在每个echo之后简单地刷新输出。

这是以前工作的代码的简化测试版......

@apache_setenv('no-gzip', 1);
@ini_set('zlib.output_compression', 0);
@ini_set('implicit_flush', 1);
for ($i = 0; $i < ob_get_level(); $i++) { ob_end_flush(); }
ob_implicit_flush(1);

set_time_limit(0);

echo 'Start ...<br />';
for( $i = 0 ; $i < 10 ; $i++ )
{
    echo $i . '<br />';
    flush();
    ob_flush();
    sleep(1);
}
echo 'End<br />';

我怀疑@ini_set命令没有超出设置,我只是希望有一个简单的例子来刷新输出缓冲区。大多数在线示例来自6年多以前,而且没有一个有效。我读到缓冲是用PHP5.4重写的,所以我想知道这是否也应该受到责备。

1 个答案:

答案 0 :(得分:0)

我已经测试了您的脚本并完成了一些修复/增强功能

@apache_setenv('no-gzip', 1);
@ini_set('zlib.output_compression', 0);

// you can dismiss this configuration, the bellow explanation is from the php.ini itself
/* Implicit flush tells PHP to tell the output layer to flush itself
   automatically after every output block.  This is equivalent to calling the
   PHP function flush() after each and every call to print() or echo() and each
   and every HTML block.
*/
@ini_set('implicit_flush', 1); 
for ($i = 0; $i < ob_get_level(); $i++) { ob_end_flush(); }
ob_implicit_flush(1);

set_time_limit(0);

echo 'Start ...<br />';
for( $i = 0 ; $i < 10 ; $i++ )
{
    // put the bellow php code if the user browser is Firefox, Internet Explorer or Safari
    // Google Chrome just works fine with it but it do not need
    echo str_repeat(" ", 1024);

    echo $i . '<br />';
    flush();
    // ob_flush(); you have used flush(), why using ob_flush() there is nothing to flush anymore
    sleep(1);
}
echo 'End<br />';

我不认为PHP版本的更新会导致问题,但我不确定 希望有所帮助:)