最近由于业务需要,需要使用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\r\n");
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\r\n");解决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才是真正的输出。

Nginx+phpfastcgi下flush 一下子全部输出问题的更多相关文章

  1. Nginx+phpfastcgi下flush输出问题

    最近由于业务需要,需要使用php的flush输出缓存刷新,处理浏览器超时问题. 最初的测试代码如下: ob_start();//打开缓冲区 for ($i=10; $i>0; $i--) { e ...

  2. php在Nginx环境下进行刷新缓存立即输出,实现常驻进程轮询。

    以下面这段代码并不会逐个输出,而是当浏览器筹够一定字节数进行统一输出,结果显而易见,10秒后一次性输出所有内容 for($i=0;$i<10;$i++){ echo $i.'</br> ...

  3. nginx负载下站点错误响应会导致其他节点重复响应问题的解决过程

    目录 前言 问题来了 问题又来了 问题分析 困惑 转机 后续 前言: 这是我上周工作过程中的一次解决问题的过程.解决的是nginx负载下站点错误响应导致其他节点重复响应. 我在整理这个记叙文时,在给这 ...

  4. 网站nginx负载下因程序错误导致多节点重复处理请求的解决过程

    目录 前言 问题来了 问题又来了 问题分析 困惑 转机 后续 前言: 这是我上周工作过程中的一次解决问题的过程.解决的是nginx负载环境下,因为应用程序异常导致某一请求被多节点站点重复处理的问题. ...

  5. nginx环境下配置nagios-关于nagios配置文件nginx.conf

    接上文:nginx环境下配置nagios-关于nginx.conf 配置如下: ;          location ~ .*\.(php|php5)?$          {            ...

  6. nginx环境下配置nagiosQL-关于nagiosql配置文件

    接上文:nginx环境下配置nagios-关于nginx.conf nagiosql文件应该处于conf/domain/目录下 nagiosql配置如下: ;                  gzi ...

  7. Nginx环境下配置PHP使用的SSL认证(https)

    最近一段时间发现好多网站都从http协议变成了加密的https协议,比如说百度.吾志等等.https看起来比http高端了好多,而且在不同的浏览器向上还会显示出不同于http的URL展示效果(比如说c ...

  8. 【转】Nginx windows下搭建过程

    Nginx windows下搭建过程 内容列表: 简要介绍 下载安装 配置测试 一.简要介绍 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器, ...

  9. 【thinkphp 5 在nginx 环境下路由无法生效(404 500错误 )的解决方法】

      非常惭愧的说,由于之前一直使用的是windowservice,安装apache来进行服务器布置的,这种方式也是最简单最直接的方式, 但是由于php的服务大多都是linux栈的,咱们也不能落后呀,在 ...

随机推荐

  1. target 标签

    <!DOCTYPE html><html><head><style>:target{border: 2px solid #D4D4D4;backgrou ...

  2. play的过滤类怎么实现继承问题

    原文: Example: public class Secure extends Controller {          @Before     static void checkAuthenti ...

  3. Linux常用插件

    文件传输 虚拟机用xshell连接时,拖拽传输插件 yum install lrzsz setup界面化工具 yum install setuptool yum install ntsysv    # ...

  4. classpath到底指的哪里

    之前一直对classpath不太明白到底指的哪里,今天研究了一下,做个总结.. classpath顾名思义就是指类路径,但是这样解释可能还是不明白,这里拿一个SpringBoot应用编译后生成的tar ...

  5. UVA-11294 Wedding (2-SAT)

    题目大意:一张长桌,n对夫妻,编号为0~n,这些人要坐在长桌两侧,每对夫妻不能坐在同一侧.其中,有2*m个人相互讨厌,编号为0的夫妻中的妻子不愿意让对面那一侧中有两个相互吵过架的人,找一种排座位方案. ...

  6. C# 处理 JSON 常用的帮助类

    C#请求接口的方法,具体代码: 首先需要添加引用和第三方的组件,具体如下: 引用命名空间: using System.IO; using Newtonsoft.Json.Linq; using Sys ...

  7. 如何理解CMDB的套路

    CMDB成功和失败,关于掌握的CMDB套路的多与少.深与浅! 前几天在对一个项目进行总结,编写CMDB的配置管理规范,发现还是有很多套路,本文就是老王总结的CMDB套路! 套路1:CMDB名字应该改一 ...

  8. JPlayer使用之二,主要函数介绍

    上一篇插件搭建的顺序最后一步的页面初始化函数中,就是最重要的一步,就先从这个函数说起吧. $("#jquery_jplayer_1").jPlayer({ ready: funct ...

  9. 20165202 预备作业3 Linux安装及学习

    一.虚拟机安装 娄老师的<基于VirtualBox安装Ubuntu图文教程>对于安装过程的介绍很易懂,但在安装过程中还是遇到了一些问题 Q1:安装教程中下载地址的VM提示安装包损坏 解决办 ...

  10. 获取url的hash值

    location是javascript里边管理地址栏的内置对象,比如location.href就管理页面的url,用location.href=url就可以直接将页面重定向url. 而location ...