星联网络专注帝国CMS二次功能插件开发-精品网站模板站长代码素材

  • 最近更新
  • 模板:33
  • 记录:12641|
  • 插件:52|
  • 工具:4|
  • 代码:8|
  • 评论:0

php ob_start()、ob_end_flush和ob_end_clean()多级缓冲

前言

本文重点解决phpob_sa()、ob_ed_flush和ob_ed_clea()多级缓冲问题,希望能够帮助到你

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();
	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

很明显,结果为: 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();
	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

结果: 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(); //第二次修改
	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

这次,什么都没有输出来。 中间不是有一个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中,因此也就整个程序也就没有任何的输出了。
	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

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)

本网刊登的文章均仅代表作者个人观点,并不代表本网立场。文中的论述和观点,敬请读者注意判断。

本文地址:http://www.xlkjgs.com/notes/html/638.html

以上内容由本站整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

星联网络

星联网络是中国最具实战的互联网创业者的知识服务商,这里有互联网行业动态,网络推广,SEO优化,SEM优化,ESC配置,行业经验分型,互联网项目,微信营销、淘宝客赚钱、新媒体营销、京东运营、跨境电商等众多互联网营销知识分享

站长运营站长必备网站运营之道才能长久发展