如何正确显示所有浏览器上每个回显的输出?

时间:2011-03-16 12:04:11

标签: php browser output-buffering

我将文件移动到新服务器,我有一个脚本,可以立即显示每个echo到浏览器的输出,但这不适用于新服务器。这是我的测试代码:

@ini_set('output_buffering', 0); @ini_set('implicit_flush', 1);

for ($i = 0; $i < ob_get_level(); $i++) ob_end_flush();

ob_implicit_flush(1);

ignore_user_abort(true); set_time_limit(0);


$max_wait_time = 30;

$begin_time = microtime(true);

$elapsed_time = 0;


while(!connection_aborted()) {

    echo $i++.str_repeat(' ', 1020).'<br/>';

    flush(); ob_flush();

    usleep(1000000);

    if($elapsed_time > $max_wait_time){ break; }

    $elapsed_time++;

}

我尝试了一些已成为上述内容的东西。但转向输出缓冲和冲洗并不适合我。我在Chrome和Firefox上测试过它们,它们都只是在最后输出所有内容。

有什么想法吗?

4 个答案:

答案 0 :(得分:13)

摘自flush documentation

  

flush()可能无法覆盖   你网络的缓冲方案   服务器,它对任何都没有影响   浏览器中的客户端缓冲。   [...]

     

多个服务器,特别是在Win32上,   仍将缓冲你的输出   脚本,直到它之前终止   将结果传送给   浏览器。

     

Apache的服务器模块   mod_gzip可以自己缓冲   这将导致flush()不会导致   数据被立即发送到   客户端。

您可能会更改为其他Web服务器(或Web服务器配置),这会在输出之前缓冲整个脚本的输出。

答案 1 :(得分:1)

您正在寻找的设置在您的PHP.ini中,它被称为output_buffering:

; output_buffering
;   Default Value: Off
;   Development Value: 4096
;   Production Value: 4096

手动将其设置为关闭并重新启动您的网络服务器以使flush()在您需要时实际刷新内容,而不是在4kb数据之后:)

请注意,ini_set并不总是必须为此工作。如果你想要完全控制,请在php.ini本身中禁用它,或者作为.htacces php_value标志

答案 2 :(得分:0)

浏览器决定何时输出内容。因此,如果您没有达到该阈值,他们只会等到它满足,然后才会向用户显示更多内容。

答案 3 :(得分:0)

尝试添加到.htaccess

    php_value output_buffering Off