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\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才是真正的输出。

时间: 2024-10-18 09:59:53

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

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秒后数据一次性都输出出来

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

最近一段时间发现好多网站都从http协议变成了加密的https协议,比如说百度.吾志等等.https看起来比http高端了好多,而且在不同的浏览器向上还会显示出不同于http的URL展示效果(比如说chrome 和QQ浏览器 使用https协议的网址就会变色). 于是自己就想着把自己的网站加一个ssl证书,使之变成https://iwenku.net 最开始我使用的是腾讯云的服务器,服务器系统是Windows,使用Windows虽然坏处挺多,但是也有好处,那就是Windows是图形化界面的,这样

使用redis解决tomcat6在nginx负载下多节点共享session问题

使用redis共享tomcat多节点session,需要安装redis.nginx.tomcat6以及用于tomcat存储session到redis的jar包:tomcat-redis-session-manager-1.2-tomcat-6.jar. commons-pool-1.6.jar.jedis-2.1.0.jar等.这些jar包.配置文件及demo程序可以在最后的demo地址中下载. 下面是对tomcat.nginx进行配置及运行: 1.把demo包中的jar包拷贝到tomcat的l

nginx环境下配置nagios-关于start_perl_cgi.sh

1 #!/bin/bash 2 set -x 3 dir=/export/servers/nginx 4  5 stop () 6 { 7 #pkill  -f  $dir/perl-fcgi.pl 8 kill $(cat $dir/logs/perl-fcgi.pid) 9 rm $dir/logs/perl-fcgi.pid 2>/dev/null10 rm $dir/logs/perl-fcgi.sock 2>/dev/null11 echo "stop perl-fcgi 

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

接上文:nginx环境下配置nagios-关于nginx.conf nagiosql文件应该处于conf/domain/目录下 nagiosql配置如下: 1 server 2 { 3         listen       8088; 4         server_name  192.168.44.44; 5         index index.html index.htm index.php; 6         root  /usr/local/nagios/nagiosql/;

解决Nginx环境下WordPress后台缺少”Wp-Admin”路径

在nginx环境下访问有时访问wordpress后台会直接返回错误.仔细发现路径少了wp-admin,解决方法很简单在/usr/local/nginx/conf/wordpress.conf文件进行修改 location / { index index.html index.php; if (-f $request_filename/index.html){ rewrite (.*) $1/index.html break; } if (-f $request_filename/index.ph

Linux:在已安装nginx情况下安装nginx模块

在已安装nginx情况下安装nginx模块 nginx第三方模块安装方法: 代码如下: ./configure --prefix=/你的安装目录  --add-module=/第三方模块目录 1..查看nginx编译安装时的命令,安装了哪些模块 代码如下: #/usr/local/webserver/nginx/sbin/nginx -V 2.切换到root用户 代码如下: #su root 3.在已安装nginx情况下安装nginx模块(username为系统用户名) 代码如下: # sudo

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

接上文:nginx环境下配置nagios-关于nginx.conf 配置如下: 1 server 2 { 3         listen       80; 4         server_name  192.168.44.44; 5         index index.html index.htm index.php; 6         root  /usr/local/nagios/share; 7         auth_basic "Nagios Access"; 

nginx环境下配置nagios-关于commands.cfg

nagios监控Linux/windows常用配置,以snmp.nrpe实现 1 # 'process-host-perfdata' command definition 2 define command{  3     command_name    process-host-perfdata  4     #command_line    /usr/bin/printf "%b" "$LASTHOSTCHECK$\t$HOSTNAME$\t$HOSTSTATE$\t$HO