xiaocoa 发表于 2017-5-3 13:42:12

Nginx+phpfastcgi下flush实时输出问题

Nginx+phpfastcgi下flush输出问题

标签:

最近因为事务需要,需要运用php的flush输出缓存改写,处理浏览器超时疑问.

开始的测验代码如下:



ob_start();//翻开缓冲区

for ($i=10; $i>0; $i--)

{

    echo $i.‘
‘;

    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.‘
‘;

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

页: [1]
查看完整版本: Nginx+phpfastcgi下flush实时输出问题