php 缓冲 [ 1.1 版本 ]
比如现在要实现每隔一秒输出内容:
for ($i=5; $i>0; $i--)
{
echo$i;
ob_flush();
flush();
sleep(1);
}
上面代码可以运行
现在改成:
ob_start();//打开缓冲
for ($i=5; $i>0; $i--)
{
echo $i;
ob_flush();
flush();
sleep(1);
}
这样的话就5秒后全部输出
为什么第一种没有ob_start()
就可以ob_flush();flush()
操作 实在不解
共 1 个回答
-
chocoboxxf 回答于 2015-10-28 13:37 举报
ob_start应该在你这段代码执行前已经在其他地方(框架代码)被调用过了,所以第一种情况会按照你想象的情况输出。而第二种情况,又显示的调用了一次ob_start,ob_start的效果是可以叠加的,所以后面的flush操作都没有直接输出到页面,而是继续输出到了缓冲区内,需要等到框架代码执行完成最终调用ob_end_flush输出并关闭缓冲区
共 6 条回复chocoboxxf 回复于 2015-10-28 13:51 回复应该说是可以嵌套的, 每次调用会创建一个新的缓冲区出来, 使用不当的话会出来奇怪的结果, 可以参考下这个帖子
what happened when i use multi ob_start() without ob_end_clean() or ob_end_flush()?chocoboxxf 回复于 2015-10-28 13:54 回复@xyf90314 另外可以检查下php.ini,看看output_buffering参数是不是开启了,如果参数值不是off,那就是默认开启了输出缓冲,所以即使没有框架显式地调用ob_start,也相当于在代码执行前就开启了缓冲
chocoboxxf 回复于 2015-10-28 14:03 回复@xyf90314 加入sleep函数就一样了,反正都是5秒后一下子输出所有内容
xyf90314
注册时间:2015-03-04
最后登录:2023-03-13
在线时长:95小时23分
最后登录:2023-03-13
在线时长:95小时23分
- 粉丝21
- 金钱5257
- 威望40
- 积分6607