7

我将文件移到了新服务器上,并且我有一个脚本可以立即在每个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

4 回答 4

13

flush文档摘录:

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

一些服务器,尤其是在 Win32 上,仍然会缓冲脚本的输出,直到它在将结果传输到浏览器之前终止。

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

您更改为不同的 Web 服务器(或 Web 服务器配置)的可能性很高,该服务器在输出之前缓冲整个脚本的输出。

于 2011-03-20T21:01:46.947 回答
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 标志

于 2011-03-23T18:13:15.193 回答
0

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

于 2011-03-20T13:00:19.427 回答
0

尝试添加到 .htaccess

    php_value output_buffering 关闭
于 2011-03-26T17:32:19.817 回答