ob_implicit_flush 问题无解 nginx 缓冲控制
经常写采集程序,需要实现边运行边输出的效果,以前在 Apache + mod_php 下没有什么问题,现在 nginx + php(fast cgi) 已经不行了。
来先看测试代码,以下代码实现每隔一秒输出一行内容
<?php
ob_implicit_flush(true);
for ($i = 0; $i < 5; $i++) {
echo "test $i<br />";
sleep(1);
}
ob_implicit_flush(true);
for ($i = 0; $i < 5; $i++) {
echo "test $i<br />";
sleep(1);
}
今天试了这段代码在 nginx + php(fast cgi) 下,是5秒后一起给我输出这5行的
尝试了修改 php.ini 中
output_buffering = 4096
output_buffering = 0
output_buffering = 0
都没有效果!
于是怀疑是 nginx 开启 gzip 的原因,因为 gzip 正常都是接收完从后端过来的数据才压缩,然后一次性输出给客户端,于是又尝试修改 nginx.conf
gzip off;
还是没有效果!
问题应该出在 nginx 对缓冲的控制,注意 nginx.conf 中有类似这2行
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_buffers 4 64k;
难道要我把它改成小于1K,甚至0,晕菜。。。那是不可能的!
所以,以后想要边运行边输出,要用另外的方法了。
ob_implicit_flush 永别了!
本文 21andy.com 原创,转载请以超链接方式注明出处!否则后果自负!
关于解决方案,我能想到的只有2种:
1. AJAX, 这方式的缺点有二,一就是遇到网络不稳定就哭吧,采集个百万级数据的时候,老是给你中断,二是面向的是浏览器,命令行可不会AJAX
2. 用命令行运行php程序,我试了用命令行运行上面的测试程序,还是可以一秒输出一次的,呵呵
Tags: nginx, ob_implicit_flush, 缓冲