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其他的函数还有很多,但只要能懂得这些机理应该也是不难懂的。附上其余函数

  • 相关阅读:
    从零开始入门 K8s | 应用编排与管理
    209. Minimum Size Subarray Sum
    208. Implement Trie (Prefix Tree)
    207. Course Schedule
    203. Remove Linked List Elements
    183. Customers Who Never Order
    182. Duplicate Emails
    181. Employees Earning More Than Their Managers
    1261. Find Elements in a Contaminated Binary Tree
    1260. Shift 2D Grid
  • 原文地址:https://www.cnblogs.com/youxin/p/3393536.html
Copyright © 2011-2022 走看看