zoukankan      html  css  js  c++  java
  • php ob_start()、ob_end_flush和ob_end_clean()多级缓冲

    ob_start() 和 ob_end_flush() 是一对很好的搭档,可以实现对输出的控制。当成一对出现理解起来就没什么问题,但是当他们两个各自出现次数增加时,就比较难理解了.

      

    <?php
    ob_start(); 
    echo 'level 1<br/> ';
    ob_start(); 
    echo   'level 2<br/> ';
    ob_start(); 
    echo  'level 3<br/> ';
    ob_end_flush();
    ob_end_flush();
    ob_end_flush();

    很明显,结果为:

    level 1
    level 2
    level 3

    当程序修改一下,修改一个ob_end_flush() 变成 ob_end_clean() 成为以下这个,你觉得结果会是怎样呢?附上这几个函数的讲解:

    • ob_clean — 清空(擦掉)输出缓冲区
    • ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲
    • ob_end_flush — 冲刷出(送出)输出缓冲区内容并关闭缓冲
    • ob_flush — 冲刷出(送出)输出缓冲区中的内容
    • ob_start — 打开输出控制缓冲
    <?php
    ob_start(); 
    echo   'level 1<br/> ';
    ob_start(); 
    echo   'level 2<br/> ';
    ob_start(); 
    echo   'level 3<br/> ';
    ob_end_clean();//修改处
    ob_end_flush();
    ob_end_flush();

    结果:

    level 1
    level 2

    可能你会认为ob_end_clean()会清除与他最近的ob_start()的输出;其实这个说法不是很全面,看下面的例子

    <?php
    ob_start(); 
    echo   'level 1<br/> ';
    ob_start(); 
    echo   'level 2<br/> ';
    ob_start(); 
    echo   'level 3<br/> ';
    ob_end_clean(); //第一次修改
    ob_end_flush();
    ob_end_clean(); //第二次修改
     

    这次,什么都没有输出来。

    中间不是有一个ob_flush()吗?按理来说应该是输出  level2 的。

    其实造成这样的主要原因是输出的多级缓冲机制。这个程序例子有三个ob_start(),就意味着他有3个缓冲区A,B,C,而其实php程序本身也有一个最终输出的缓冲区,我们就把他叫做F。

    在这个程序中他这几个缓冲区是有一定层次的,C->B->A->F,F层次最高,是程序最终的输出缓冲,我们按上面的程序来进行讲解。

     

    刚开始。  F:null 

    1 ob_start();

     新建缓冲区A。  A: null -> F:null

    1 echo   'level 1<br/> ';

    程序有输出,输出进入最低的缓冲区A  A: 'level 1<br/>' -> F:null

    1  ob_start(); 

    新建缓冲区B 。 B:null  ->  A: 'level 1<br/>' -> F:null

    1 echo   'level 2<br/> ';

    程序有输出,输出进入最低的缓冲区B     B:'level 2<br/> ' ->  A: 'level 1<br/>' ->F:null

    1 ob_start();

    新建缓冲区C   C:null  B:'level 2<br/> '   A: 'level 1<br/>' -> F:null

    1 echo   'level 3<br/> ';

    程序有输出,输出进入最低的缓冲区C    C:'level 3<br/> '  ->  B:'level 2<br/> '  ->  A: 'level 1<br/>' -> F:null

    1 ob_end_clean(); //第一次修改

    缓冲区C被清空并关闭。  B:'level 2<br/> '  ->  A: 'level 1<br/>' -> F:null

    1 ob_end_flush();

    缓冲区B输出到上一级的缓冲区A并关闭。   A: 'level 1<br/>level 2<br/> ' -> F:null

    1 ob_end_clean(); //第二次修改

     缓冲区A被清空并关闭。 此时缓冲区A的东西还没真正输出到最终的F中,因此也就整个程序也就没有任何的输出了。

     ob其他的函数还有很多,但只要能懂得这些机理应该也是不难懂的。附上其余函数

  • 相关阅读:
    IP负载均衡技术
    ES6 克隆对象 浅克隆:只能克隆原始对象自身的值,不能克隆它继承的值
    多层nginx中的压缩问题 api接口>1M数据的返回浏览器 网关
    Status Code: 431 Request Header Fields Too Large
    研发过程中的测试工作
    dede文章页调用当前栏目链接方法
    dedecms做好的网站怎么上传到网上?
    如何修改"DEDECMS 提示信息!"方法!
    dedecms搜索提示"关键字不能小于2个字节!"
    修改cms版权等等信息
  • 原文地址:https://www.cnblogs.com/youxin/p/3393536.html
Copyright © 2011-2022 走看看