做一个逐行输出的功能,使用ob_flush时试了N种方法不起作用,比如下面的代码:

ob_start();
for(;;)
{
    echo ".......";
    ob_flush();
    flush();
    sleep(1);
}

谷歌了不少的写法都不行,所以问题应该出在了环境配置上而不是使用方法上。

话说还是stackoverflow给力,搜索“php flush not working”找到了一个正确的解决方法:

检查nginx配置文件(nginx.conf),禁用nginxbuffering

proxy_buffering off;
gzip off;
fastcgi_keep_conn on;

要注意最后这句fastcgi的哦~~

检查php.ini,禁用buffering

output_buffering = off

注意这句配置不能通过ini_set()函数动态在程序中设置,这在php官方手册中有说明:

the output_buffering setting is PHP_INI_PERDIR therefore it may not be set using ini_set()

经过上面两步的配置(nginx.confphp.ini)后,重启nginx就可以了,再次测试文章开头的代码,成功逐行输出。