2015-10-28 10:03:12 3082次浏览 1条回答 1 悬赏 20 金钱

比如现在要实现每隔一秒输出内容:

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()操作 实在不解

  • 回答于 2015-10-28 13:37 举报

    ob_start应该在你这段代码执行前已经在其他地方(框架代码)被调用过了,所以第一种情况会按照你想象的情况输出。而第二种情况,又显示的调用了一次ob_start,ob_start的效果是可以叠加的,所以后面的flush操作都没有直接输出到页面,而是继续输出到了缓冲区内,需要等到框架代码执行完成最终调用ob_end_flush输出并关闭缓冲区

    6 条回复
    回复于 2015-10-28 13:41 回复

    ob_start的效果是可以叠加的 这句话怎么理解 何况我没用框架的

    回复于 2015-10-28 13:51 回复

    应该说是可以嵌套的, 每次调用会创建一个新的缓冲区出来, 使用不当的话会出来奇怪的结果, 可以参考下这个帖子
    what happened when i use multi ob_start() without ob_end_clean() or ob_end_flush()?

    回复于 2015-10-28 13:54 回复

    另外可以检查下php.ini,看看output_buffering参数是不是开启了,如果参数值不是off,那就是默认开启了输出缓冲,所以即使没有框架显式地调用ob_start,也相当于在代码执行前就开启了缓冲

    回复于 2015-10-28 14:01 回复

    是不是 写成

    for ($i=5; $i>0; $i--)
    {       
        echo $i; 
    }
    

    和第二种是一样的效果吧

    回复于 2015-10-28 14:03 回复

    加入sleep函数就一样了,反正都是5秒后一下子输出所有内容

    回复于 2015-10-28 14:10 回复

    牛 确实是你说的那样 php.ini开启了 3q

    , , 觉得很赞
您需要登录后才可以回答。登录 | 立即注册
xyf90314
副总裁

xyf90314

注册时间:2015-03-04
最后登录:2023-03-13
在线时长:95小时23分
  • 粉丝21
  • 金钱5257
  • 威望40
  • 积分6607

热门问题