文档章节

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

CuZn
 CuZn
发布于 2012/07/23 23:08
字数 992
阅读 2649
收藏 9
点赞 0
评论 3

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)

 

© 著作权归作者所有

共有 人打赏支持
CuZn
粉丝 3
博文 1
码字总数 992
作品 0
广州
程序员
加载中

评论(3)

小牛_2013
小牛_2013
额,不错
binzone
binzone
很清晰,受教了,thanks!
傅小黑
傅小黑
好东西啊
php函数ob_start()、ob_end_clean()、ob_get_contents()

下面3个函数的用法 obgetcontents() - 返回输出缓冲区的内容 ob_flush() - 冲刷出(送出)输出缓冲区中的内容 ob_clean() - 清空(擦掉)输出缓冲区 obendflush() - 冲刷出(送出)输出缓冲区...

BearCatYN ⋅ 2015/03/26 ⋅ 0

header("Location:login.php")应该注意的几个问题

header("Location:login.php")应该注意的几个问题 header("Location:")作为php的转向语句。其实在使用中,他有几点需要注意的地方。 1、要求header前没有任何输出 但是很多时候在header前我们...

随智阔 ⋅ 2012/11/26 ⋅ 0

PHP_header location 使用注意事项

header("Location:login.php")应该注意的几个问题 header("Location:")作为php的转向语句。其实在使用中,他有几点需要注意的地方。 1、要求header前没有任何输出 但是很多时候在header前我们...

喵王不瞌睡 ⋅ 2015/02/09 ⋅ 0

缓冲函数ob_get_contents() ob_end_clean() ob_start()的用法

下面3个函数的用法 obgetcontents(); obendclean(); ob_start() 可以借助这几个函数实现缓冲本地文件,以及执行本地脚本代码。 使用ob_start()把输出那同输出到缓冲区,而不是到浏览器。 然后...

李佳顺 ⋅ 2013/11/22 ⋅ 0

缓存原理--静态化

缓存的分类: ①程序缓存 ②ob缓存 ③浏览器缓存 如: <?php//ob_start();如果PHPini文件中开启了缓冲开关控制echo str_repeat(" ",4096),'<br/>';for ($i=0; $i < 10; $i++) { //开启缓冲开......

PHer ⋅ 2014/06/17 ⋅ 0

PHP 循环时间控制缓冲方法

PHP 循环时间控制方法 for ($i=10; $i>0; $i--) { echo $i; flush(); sleep(1); } ?> 按照php手册里的说法 该函数将当前为止程序的所有输出发送到用户的浏览器。 上面的这段代码,应该隔一秒...

GIFCOOL ⋅ 2011/10/20 ⋅ 0

PHP中的ob_start()

在PHP编程中, 我们经常会遇到一些直接产生输出的函数, 如passthru(),readfile(), var_dump() 等. 但有时我们想把这些函数的输出导入到文件中,或者先经过处理再输出, 或者把这些函数的输出作为...

晨曦之光 ⋅ 2012/03/09 ⋅ 1

php缓冲 output_buffering的使用详解

本篇文章是对php缓冲output_buffering进行了详细的分析介绍,需要的朋友参考下 buffer buffer是一个内存地址空间,Linux系统默认大小一般为4096(4kb),即一个内存页。主要用于存储速度不同步的...

freedonn ⋅ 2014/08/24 ⋅ 0

你应该这个姿势学习php(3)

1、ob_start() 开启文件缓存 2、obgetcontents() 得到缓存中的内存 3、obgetlength() 得到缓冲区的长度 4、ob_flush() 输出缓冲区的内容,如果你想获取缓冲区的内容要在这个函数之前使用obg...

思梦php ⋅ 04/15 ⋅ 0

PHP输出缓冲控制(Output Control)函数详解

之前对php输出缓存有使用,但是没有理解的那么透彻,今天看了一篇博客写得很好 转载过来了。[博客原文][1] 简介 说到输出缓冲,首先要说的是一个叫做缓冲器(buffer)的东西。举个简单的例子说...

小伟哥 ⋅ 2013/11/24 ⋅ 2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

中标麒麟(龙芯版)7.0优盘安装

########################################## 制作U盘安装盘: 1.准备U盘: PMON环境下U盘必须格式化成ext3; 昆仑固件环境下可以格式化成ext3,ext4 2.把整个镜像 xxx.iso 复制到U盘下面 3....

gugudu ⋅ 21分钟前 ⋅ 0

老司机写的大数据建模五步走

本文将尝试来梳理一下数据建模的步骤,以及每一步需要做的工作。 01 第一步:选择模型或自定义模式 这是建模的第一步,我们需要基于业务问题,来决定可以选择哪些可用的模型。 比如,如果要预...

gulf ⋅ 30分钟前 ⋅ 0

PacificA 一致性协议解读

PacificA 的 paper 在 08 年左右发出来的,比 Raft 早了 6,7 年。 在 PacificA 论文中,他们强调该算法使用范围是 LAN (Local Area Network),讲白了就是对跨机房不友好。 不管是 ZAB,Raf...

黑客画家 ⋅ 32分钟前 ⋅ 0

盘符图标个性化

设置自己的专属盘符图标 准备ico格式的图片文件一个,在根目录下创建autorun.inf文件 文件内容 [Autorun]icon=logo.ico 重新启动或者插拔U盘即可看到结果...

阿豪boy ⋅ 33分钟前 ⋅ 0

Windows下QQ聊天记录中图片的默认存放位置

Windows下QQ聊天记录中图片的默认存放位置在设置中是没有说明的。 实测位置在:D:\Documents\Tencent Files\974101467\Image 其中: “974101467”为对应的QQ号; “C2C”为个人之间的聊天图...

临江仙卜算子 ⋅ 39分钟前 ⋅ 0

GC 的三种基本实现方式

参考资料《代码的未来》(作者: [日] 松本行弘)。 由于并非本人原著(我只是个“搬运工“),SO 未经本人允许请尽情转载。 另外个人像说明一下这里所说的GC指泛指垃圾回收机制,而单指Jav...

xixingzhe ⋅ 40分钟前 ⋅ 0

Android双击退出

/** * 菜单、返回键响应 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if(keyCode......

王先森oO ⋅ 44分钟前 ⋅ 0

idea 整合 vue 启动

刚学习Vue 搭建了一个项目 只能命令启动 Idea里面不会启动 尝试了一下修改启动的配置 如下: 1.首先你要保证你的package.json没有修改过 具体原因没有看 因为我改了这个name的值 就没办法启动...

事儿爹 ⋅ 49分钟前 ⋅ 0

redis在windows环境的后台运行方法

在后台运行,首先需要安装redis服务,命令为 redis-server.exe --service-install redis.windows.conf --loglevel verbose 启动,命令为 redis-server --service-start 停止,命令为 redis-...

程序羊 ⋅ 53分钟前 ⋅ 0

比特币现金开发者提出新的交易订单规则

本周,四位比特币现金的四位开发者和研究员:Joannes Vermorel(Lokad),AmaurySéchet(比特币ABC),Shammah Chancellor(比特币ABC)和Tomas van der Wansem(Bitcrust)共同发表了一篇关...

lpy411 ⋅ 56分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部