用php实现边执行边输出的效果

客户端的请求到web服务器,web服务器再调用PHP代码;

PHP返回内容到web服务器,web服务器再返回给客户端

边执行边输出就需要web服务器和PHP都不缓存内容

首先, Nginx不缓存PHP返回的内容

header('X-Accel-Buffering: no');//关闭nginx的缓存

其次,PHP不缓存,PHP不缓存有两种方式,

        注意: 不缓存也不是直接输出到客户端,而是转为等待输出,需要调用flush()

        一是修改配置文件php.in,修改output_buffering为0或Off 默认是4096(K)

output_buffering = 0
;或者
output_buffering = Off

        二是PHP代码中关闭


ob_end_flush();
//或者
ob_end_clean(); //与ob_end_flush类似, 

//二者区别: 在下次调用flush的时候, ob_end_clean不会输出在他之前echo/print的内容, 而ob_end_flush会

        三是获取buffer中的内容进行输出

ob_flush()

最后展示

header('X-Accel-Buffering: no');//关闭nginx的缓存
echo 'begin...<br>';


//方式1
ob_end_flush();//关闭缓存 数据不再存储到buffer区域中,变为等待输出状态
for($i = 1; $i <= 3; $i++)
{
    echo 'loading '.$i.'0%<br>';
    flush();//将等待输出的数据立刻输出到客户端
    sleep(1);
}

//方式2
ob_end_flush();//关闭缓存 数据不再存储到buffer区域中,变为等待输出状态
ob_implicit_flush(1);//打开绝对(隐式) 刷送。每次输出调用后有一次刷送操作,以便不再需要对 flush() 的显式调用。
for($i = 1; $i <= 3; $i++)
{
    echo 'loading '.$i.'0%<br>';
    sleep(1);
}

//方式3
for($i = 1; $i <= 3; $i++)
{
    echo 'loading '.$i.'0%<br>';
    ob_flush();//获取缓存区的内容,转为等待输出状态
    flush();//将等待输出的数据立刻输出到客户端
    sleep(1);
}

apache需要更改httpd.conf 的 FcgidOutputBufferSize 0

参考文章:

最详细的PHP flush()与ob_flush()的区别详解

详细介绍文档

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值