zoukankan      html  css  js  c++  java
  • Nginx+phpfastcgi下flush输出问题

    最近由于业务需要,需要使用php的flush输出缓存刷新,处理浏览器超时问题.

    最初的测试代码如下:

    ob_start();//打开缓冲区
    for ($i=10; $i>0; $i--)
    {
        echo $i.'<br />';
        ob_flush();
        flush();
        sleep(1);
    }
    ob_end_flush();//输出并关闭缓冲
    die();
    

     本以为这样就能1秒钟输出一个数字,但是在nginx+php的环境下,实际产生的结果与预期是不一样的,结果是10秒后数据一次性都输出出来了。

    以前在apache里运行正常,每隔1秒动态刷新浏览器输出缓存内容,那是因为apache里没有开启gzip。纠结了半天,上网查了许久的问题,最后解决的方法如下:

    header("Content-Encoding: none
    ");
    ob_start();//打开缓冲区
    for ($i=10; $i>0; $i--)
    {
        echo str_repeat(" ",1024*64);
        echo $i.'<br />';
        ob_flush();
        flush();
        sleep(1);
    }
    ob_end_flush();//输出并关闭缓冲
    die;
    

     解释下为什么要这么写这段代码:

    首先:header("Content-Encoding: none ");解决nginx在配置文件中开启了gzip的问题,如果nginx的gzip的配置项是on,而不加这行代码,结果还是一样等程序执行完毕后一次性的把数据输出出来;其实也可以不用加这行代码,直接在nginx配置文件中关闭gzip,但是不能因为一个小需求而改nginx的配置吧。

    其次:echo str_repeat(" ",1024*64)这行代码也是重点,一开始我也没有加这行代码,最后的实现的效果还是一次性的把数据输出出来,造成的原因是nginx中的    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;

    这两个配置表示Nginx会缓冲PHP-FPM输出的信息,当达到64k时才会将缓冲区的数据发送给客户端,由于我们只输出了一个数字,远远不到64k这个上限,所以在程序输出之前加上echo str_repeat(" ",1024*64);1024*64值根据个人的nginx配置进行修改。

    最后一点:ob_flush()和flush()要结合使用,而且ob_flush要在flush之前,flush才是真正的输出。

  • 相关阅读:
    卷积神经网络
    舍弃—Dropout
    池化—Pooling
    Python基础知识点——简单 函数
    同事将excel数据转化为pdf,提前下班了,而我还在苦逼地做表
    怎么才能隐藏的IP?打造超强IP池项目,让你自己都忘记原本的IP
    Python爬取抖音视频(没有水印的哟)
    Python可视化:matplotlib 制作雷达图进行对比分析
    用于GIS(地理信息系统)和三维可视化制图的Python库
    关于如何在文件中调用命令窗口执行代码(以python为例)
  • 原文地址:https://www.cnblogs.com/daly2008/p/4867367.html
Copyright © 2011-2022 走看看