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

Luc*_*eis 0 php windows flush

我认为flush();至少可以使用Google/Stackoverflow告诉我的功能,但是在我的Windows WAMP(Windows,Apache,MySQL,PHP)系统上,它不起作用.

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

这是我的代码:

<?php
echo "Fun";

flush();

sleep(5);

echo "<br>Mo";
?>
Run Code Online (Sandbox Code Playgroud)

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

我已经尝试了其他类似的冲洗,ob_end_flush(); or ob_implicit_flush(true);但没有任何工作.有任何想法吗?

Rog*_*ger 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);
}
Run Code Online (Sandbox Code Playgroud)


jmz*_*jmz 5

该脚本在CLI中运行良好,显示"Fun",在显示"<br> Mo"之前等待5秒.

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

  1. 浏览器不会马上开始渲染.为HTML文档获取3个字节的数据是不够的,所以它很可能还要等待一些.
  2. 在收到换行符之前,lib级别的隐式IO缓冲很可能是活动的.

要解决1)使用text/plain内容类型进行测试; 2)需要换行,所以做一个echo "Fun\n";echo "<br>Mo\n";你当然不会是使用text/plain的真正的HTML数据.