知识库

记录点点滴滴

PHP 实现边执行边输出

在一些大型应用长,比如discuz、wordpress等,我们常可以看到php程序可以在执行的同时同步输出执行结果,直到执行完毕。为此笔者展开了相关的探索。

Apache

apache实现这个效果容易很多

程序实现的关键是关闭输出缓冲区与刷新输出缓冲,同时由于边执行边输出的程序往往需要执行较长的时间, 因此我们在程序的开始设置超时时间为0,避免服务器因为程序执行超时而关闭进程。

Nginx

当我们把上面的代码放在Nginx的服务器上执行时,发现并不能成功的实现边执行边输出的效果。

首先这个问题核心就是当缓冲区数据达到一定量时先输出到浏览器。
而apache和nginx 的php执行方式差异导致了两个效果的产生。

为此,我们需要对Nginx的配置进行改动

在nginx.conf: 在http{}中加入fastcgi_keep_conn on;gzip off;

同时程序修改为如下

上面的代码中,核心是ob_flush和flush以及repeat。

注意,repeat在上面的程序中扩充到了2k,实际要以nginx中的配置为准。

可如下配置

 

扩展

ob_flush()和flush()的区别。

前者是把数据从PHP的缓冲中释放出来,后者是把不在缓冲中的或者说是被释放出来的数据发送到浏览器。所以当缓冲存在的时候,我们必须ob_flush()和flush()同时使用。正确使用的顺序是:先用ob_flush(),后用flush()。

点赞

发表评论

邮箱地址不会被公开。 必填项已用*标注