php ob_start()、ob_end_flush和ob_end_clean()多级缓冲
来源:互联网 发布:内蒙古七二三工程知乎 编辑:程序博客网 时间:2024/05/17 06:45
转载自:http://my.oschina.net/CuZn/blog/68650
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
ob_start();
新建缓冲区A。 A: null -> F:null
echo
'level 1<br/> '
;
程序有输出,输出进入最低的缓冲区A A: 'level 1<br/>' -> F:null
ob_start();
新建缓冲区B 。 B:null -> A: 'level 1<br/>' -> F:null
echo
'level 2<br/> '
;
程序有输出,输出进入最低的缓冲区B B:'level 2<br/> ' -> A: 'level 1<br/>' ->F:null
ob_start();
新建缓冲区C C:null B:'level 2<br/> ' A: 'level 1<br/>' -> F:null
echo
'level 3<br/> '
;
程序有输出,输出进入最低的缓冲区C C:'level 3<br/> ' -> B:'level 2<br/> ' -> A: 'level 1<br/>' -> F:null
ob_end_clean();
//第一次修改
缓冲区C被清空并关闭。 B:'level 2<br/> ' -> A: 'level 1<br/>' -> F:null
ob_end_flush();
缓冲区B输出到上一级的缓冲区A并关闭。 A: 'level 1<br/>level 2<br/> ' -> F:null
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_start callback function to gzip output buffer
- ob_implicit_flush — 打开/关闭绝对刷送
- ob_list_handlers — 列出所有使用中的输出处理程序。
- ob_start — 打开输出控制缓冲
- output_add_rewrite_var — 添加URL重写器的值(Add URL rewriter values)
- output_reset_rewrite_vars — 重设URL重写器的值(Reset URL rewriter values)
- php ob_start()、ob_end_flush和ob_end_clean()多级缓冲
- 转开源中国的php ob_start()、ob_end_flush和ob_end_clean()多级缓冲
- 在开源中国上找到的,php ob_start()、ob_end_flush和ob_end_clean()多级缓冲不错的讲解
- ob_start()、ob_end_flush和ob_end_clean()
- php函数ob_start()、ob_end_clean()、ob_get_contents()
- php函数ob_start()、ob_end_clean()、ob_get_contents()
- php函数ob_start()、ob_end_clean()、ob_get_contents()
- php缓冲 output_buffering和ob_start
- php缓冲 output_buffering和ob_start buffer
- ob_get_contents(); ob_end_clean(); ob_start()用法
- ob_start、ob_get_contents()、ob_end_clean();用法
- ob_start,ob_end_clean,ob_get_contents函数
- ob_start、ob_get_contents()、ob_end_clean()等用法
- php语言,如何用html代码输出一个网页ob_start&&ob_end_flush
- 【php】header()和ob_start()
- ob_get_contents();ob_end_clean();ob_start();的具体用法
- php 缓存output_buffering和ob_start
- php 缓存output_buffering和ob_start
- Uva 10369 Arctic Network 最小生成树
- 大数据架构师基础:hadoop家族,Cloudera产品系列等各种技术
- ssh2框架Struts2中action的属性配置错误问题
- canvas画图的一个坑
- 听说现在上网可以查到开房记录,我顿时就慌了,如果被人发现我从来没开过房,多难为情啊!
- php ob_start()、ob_end_flush和ob_end_clean()多级缓冲
- 待字闺中之Magic Index 分析
- source insight的查找功能
- H.264视频编码在VC++.Net中的实现
- SQL Server 存储过程
- hadoop学习【7】——基于hadoop的分布式分词程序
- mysql 中的datetime和timestamp的比较
- python学习4:sys标准库模块使用
- POJ-1008-Maya_Calendar