代码之家  ›  专栏  ›  技术社区  ›  Luca Matteis

PHP在调用echo时立即刷新输出

  •  0
  • Luca Matteis  · 技术社区  · 14 年前

    我想 flush(); 至少从Google/Stackoverflow告诉我的情况来看,它可以工作,但是在我的windowswamp(Windows,Apache,MySQL,PHP)系统上它不工作。

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

    这是我的密码:

    <?php
    echo "Fun";
    
    flush();
    
    sleep(5);
    
    echo "<br>Mo";
    ?>
    

    当脚本执行完毕(5秒后)时,代码将一起输出。。我不想这样,我希望“乐趣”马上出现,然后在5秒钟后“Mo”。

    我试过其他的花红组合,比如 ob_end_flush(); or ob_implicit_flush(true); 但什么都没用。有什么想法吗?

    6 回复  |  直到 14 年前
        1
  •  5
  •   jmz    14 年前

    脚本在CLI中工作正常,显示“Fun”,等待5秒后显示“<br>“Mo”。

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

    1. 在接收到换行之前,lib级别的隐式IO缓冲很可能处于活动状态。

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

        2
  •  7
  •   Roger    14 年前

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

    • 在php.ini:

      . zlib.output_compression =关

    • . 关闭gzip;

      . 代理缓冲关闭;

    手头也有这条线,特别是如果你没有进入php.ini:

    • @初始集合('zlib.output_compression',0);

    • 设置时间限制(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);
    }
    
        3
  •  3
  •   Vincent    14 年前

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

    ob_implicit_flush();
    
        4
  •  1
  •   Philipp    14 年前

    如果问题仍然存在,尽管您显式设置

    implicit_flush = yes 
    

    在你的php.ini,您可能还需要设置

    output_buffering = off
    

    在我的情况下,哪一个起了作用(在拔了4个多小时的头发之后)

        5
  •  0
  •   tamasd    14 年前

    检查您的php.ini 对于 output_buffering .

        6
  •  0
  •   Savageman    14 年前

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