0

至少从 Google/Stackoverflow 告诉我的内容来看,我认为flush();会起作用,但在我的 Windows WAMP(Windows、Apache、MySQL、PHP)系统上它不起作用。

我必须设置一些 PHP 设置才能使 flush() 工作吗?

这是我的代码:

<?php
echo "Fun";

flush();

sleep(5);

echo "<br>Mo";
?>

当脚本完成执行时(5 秒后),代码只是一起输出。我不希望这样,我希望“Fun”立即出现,然后在 5 秒后出现“Mo”。

我尝试过其他类似的冲洗组合,ob_end_flush(); or ob_implicit_flush(true);但没有任何效果。有任何想法吗?

4

6 回答 6

7

所以这就是我发现的:

Flush 在 Apache 的 mod_gzip 或 Nginx 的 gzip 下不起作用,因为从逻辑上讲,它正在对内容进行 gzip 压缩,为此它必须缓冲内容以对其进行 gzip。任何类型的 Web 服务器 gzipping 都会影响这一点。简而言之,在服务器端,我们需要禁用 gzip 并减小 fastcgi 缓冲区大小。所以:

  • 在 php.ini 中:

    . output_buffering = 关闭

    . zlib.output_compression = 关闭

  • 在 nginx.conf 中:

    . gzip 关闭;

    . proxy_buffering 关闭;

手头也有这行,特别是如果您没有访问 php.ini 的权限:

  • @ini_set('zlib.output_compression',0);

  • @ini_set('implicit_flush',1);

  • @ob_end_clean();

  • 设置时间限制(0);

最后,如果你有它,请评论下面的代码:

  • ob_start('ob_gzhandler');

  • ob_flush();

PHP测试代码:

ob_implicit_flush(1);

for($i=0; $i<10; $i++){
    echo $i;

    //this is for the buffer achieve the minimum size in order to flush data
    echo str_repeat(' ',1024*64);

    sleep(1);
}
于 2011-02-12T15:26:20.610 回答
5

该脚本在 CLI 中运行良好,显示“Fun”,等待 5 秒后显示“<br>Mo”。

对于浏览器,结果可能会有所不同,因为:

  1. 浏览器不会立即开始渲染。为 HTML 文档获取 3 个字节的数据不足以做任何事情,所以它很可能会等待更多。
  2. 在收到换行符之前,lib 级别的隐式 IO 缓冲很可能处于活动状态。

解决方法 1) 使用文本/纯内容类型进行测试;echo "Fun\n";2) 需要换行符,所以echo "<br>Mo\n";当然你不会将 text/plain 用于真正的 HTML 数据。

于 2010-08-14T11:33:30.503 回答
3

如果您使用的是 CGI/FastCGI,请忘记它!这些不实现刷新。网络服务器可能有它自己的缓冲区。

您可以使用以下命令禁用 PHP 中的所有输出缓冲:

ob_implicit_flush();
于 2010-08-14T11:45:15.540 回答
1

如果问题仍然存在,尽管您明确设置

implicit_flush = yes 

在您的 php.ini 中,您可能还想设置

output_buffering = off

这在我的情况下起到了作用(在拉我的头发 4 小时后)

于 2011-01-22T15:19:52.873 回答
0

检查你的 php.ini 文件output_buffering

于 2010-08-14T11:19:44.570 回答
0

也许问题是这里的 Apache,它也可能有缓冲区......

于 2010-08-14T11:26:29.397 回答