您的位置:首页 > 编程语言 > PHP开发

在开源中国上找到的,php ob_start()、ob_end_flush和ob_end_clean()多级缓冲不错的讲解

2012-10-28 09:10 676 查看

phpob_start()、ob_end_flush和ob_end_clean()多级缓冲

1人收藏此文章,我要收藏发表于3个月前(2012-07-23
23:08),已有132次阅读共1个评论

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

01
<?php
02
ob_start();
03
echo
'level
1<br/>'
;
04
ob_start();
05
echo
'level
2<br/>'
;
06
ob_start();
07
echo
'level
3<br/>'
;
08
ob_end_flush();
09
ob_end_flush();
10
ob_end_flush();
很明显,结果为:

level1

level2

level3

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

ob_clean—清空(擦掉)输出缓冲区
ob_end_clean—清空(擦除)缓冲区并关闭输出缓冲
ob_end_flush—冲刷出(送出)输出缓冲区内容并关闭缓冲
ob_flush—冲刷出(送出)输出缓冲区中的内容
ob_start—打开输出控制缓冲

01
<?php
02
ob_start();
03
echo
'level
1<br/>'
;
04
ob_start();
05
echo
'level
2<br/>'
;
06
ob_start();
07
echo
'level
3<br/>'
;
08
ob_end_clean();
//修改处
09
ob_end_flush();
10
ob_end_flush();
结果:

level1

level2

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

01
<?php
02
ob_start();
03
echo
'level
1<br/>'
;
04
ob_start();
05
echo
'level
2<br/>'
;
06
ob_start();
07
echo
'level
3<br/>'
;
08
ob_end_clean();
//第一次修改
09
ob_end_flush();
10
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/>'
;
程序有输出,输出进入最低的缓冲区AA:'level1<br/>'->F:null

1
ob_start();
新建缓冲区B。B:null->A:'level1<br/>'->F:null

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

1
ob_start();
新建缓冲区CC:nullB:'level2<br/>'A:'level1<br/>'->F:null

1
echo
'level
3<br/>'
;
程序有输出,输出进入最低的缓冲区CC:'level3<br/>'->B:'level2<br/>'->A:'level1<br/>'->F:null

1
ob_end_clean();
//第一次修改
缓冲区C被清空并关闭。B:'level2<br/>'->A:'level1<br/>'->F:null

1
ob_end_flush();
缓冲区B输出到上一级的缓冲区A并关闭。A:'level1<br/>level2<br/>'->F:null

1
ob_end_clean();
//第二次修改
缓冲区A被清空并关闭。此时缓冲区A的东西还没真正输出到最终的F中,因此也就整个程序也就没有任何的输出了。

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

flush—刷新输出缓冲
ob_clean—清空(擦掉)输出缓冲区
ob_end_clean—清空(擦除)缓冲区并关闭输出缓冲
ob_end_flush—冲刷出(送出)输出缓冲区内容并关闭缓冲
ob_flush—冲刷出(送出)输出缓冲区中的内容
ob_get_clean—得到当前缓冲区的内容并删除当前输出缓。
ob_get_contents—返回输出缓冲区的内容
ob_get_flush—刷出(送出)缓冲区内容,以字符串形式返回内容,并关闭输出缓冲区。
ob_get_length—返回输出缓冲区内容的长度
ob_get_level—返回输出缓冲机制的嵌套级别
ob_get_status—得到所有输出缓冲区的状态
ob_gzhandler—在ob_start中使用的用来压缩输出缓冲区中内容的回调函数。ob_startcallbackfunction
togzipoutputbuffer
ob_implicit_flush—打开/关闭绝对刷送
ob_list_handlers—列出所有使用中的输出处理程序。
ob_start—打开输出控制缓冲
output_add_rewrite_var—添加URL重写器的值(AddURLrewritervalues)
output_reset_rewrite_vars—重设URL重写器的值(ResetURLrewriter
values)

http://my.oschina.net/CuZn/blog/68650
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: