一旦调用echo,PHP就会刷新输出

时间:2010-08-14 11:15:35

标签: php windows flush

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

是否有一些PHP设置我必须设置为使flush()工作?

这是我的代码:

<?php
echo "Fun";

flush();

sleep(5);

echo "<br>Mo";
?>

当脚本完成执行时(5秒后),代码只输出所有内容..我不想要这个,我希望'Fun'立即显示,然后在5秒后'Mo'。< / p>

我已经尝试了其他类似的ob_end_flush(); or ob_implicit_flush(true);的组合,但没有任何效果。有什么想法吗?

6 个答案:

答案 0 :(得分:7)

这就是我发现的:

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

  • 在php.ini中:

    。 output_buffering =关

    。 zlib.output_compression =关

  • 在nginx.conf中:

    。 gzip off;

    。 proxy_buffering off;

还有这些线,特别是如果你没有访问php.ini:

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

  • @ini_set( 'implicit_flush',1);

  • @ob_end_clean();

  • 参数或者set_time_limit(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);
}

答案 1 :(得分:5)

该脚本在CLI中正常工作,显示“Fun”,在显示“&lt; br&gt; Mo”之前等待5秒。

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

  1. 浏览器不会马上开始渲染。获取HTML文档的3个字节的数据是不够的,所以它很可能还要等几个。
  2. 在收到换行符之前,lib级别的隐式IO缓冲很可能会处于活动状态。
  3. 要解决1)使用text / plain内容类型进行测试; 2)需要换行符,所以echo "Fun\n";echo "<br>Mo\n";当然你不会使用text / plain来获取真实的HTML数据。

答案 2 :(得分:3)

如果您正在使用CGI / FastCGI,请忘掉它!这些不实现flush。 Web服务器可能拥有自己的缓冲区。

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

ob_implicit_flush();

答案 3 :(得分:1)

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

implicit_flush = yes 
在你的php.ini中

,你可能还想设置

output_buffering = off

在我的情况下做了这个伎俩(把我的头发拉了4个小时后)

答案 4 :(得分:0)

检查你的php.ini是否为output_buffering

答案 5 :(得分:0)

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