Andy's Blog » ob_implicit_flush, php ob_implicit_flush, nginx flush, nginx ob_flush, php flush nginx, ob_flush nginx, nginx ob_clean, ob_flush, flush nginx, php implicit flush, nginx ob_implicit_flush » ob_implicit_flush 问题无解 nginx 缓冲控制

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)
}

今天试了这段代码在 nginx + php(fast cgi) 下,是5秒后一起给我输出这5行的

尝试了修改 php.ini 中

output_buffering = 4096
output_buffering = 0

都没有效果!

于是怀疑是 nginx 开启 gzip 的原因,因为 gzip 正常都是接收完从后端过来的数据才压缩,然后一次性输出给客户端,于是又尝试修改 nginx.conf

gzip off;

还是没有效果!

问题应该出在 nginx 对缓冲的控制,注意 nginx.conf 中有类似这2行

fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;

难道要我把它改成小于1K,甚至0,晕菜。。。那是不可能的!

所以,以后想要边运行边输出,要用另外的方法了。
ob_implicit_flush 永别了!

本文 21andy.com 原创,转载请以超链接方式注明出处!否则后果自负!

关于解决方案,我能想到的只有2种:
1. AJAX, 这方式的缺点有二,一就是遇到网络不稳定就哭吧,采集个百万级数据的时候,老是给你中断,二是面向的是浏览器,命令行可不会AJAX
2. 用命令行运行php程序,我试了用命令行运行上面的测试程序,还是可以一秒输出一次的,呵呵

Incoming search terms:

Tags: nginx, ob_implicit_flush, 缓冲

本文地址: http://www.21andy.com/new/20100209/1655.html