Php output buffering缓存及程序缓存深入解析


Posted in PHP onJuly 15, 2013

下面测试ob缓存和程序缓存:
在测试前为了测试效果更明显,我们在php.ini里先关闭ob缓存并设置明显的错误级别。
Output_buffering=off
Display_errors=on
代码1:

echo "php";
header("content-type:text/html;charset='utf-8'");
echo 'ok';

则会出现
php
Warning: Cannot modify header information - headers already sent by (output started at D:\www\apache\htdocs\test\t2.php:2) in D:\www\apache\htdocs\test\t2.php on line 3
ok
代码2:
ob_start();
 echo "php";
 header("content-type:text/html;charset='utf-8'");
 echo 'ok';

结果就完全正确了

原因分析:
代码1:
Php在echo ‘php'时已经向浏览器发送一个头信息,
当再出现
header("content-type:text/html;charset='utf-8'");
又看到一个头信息,这时已经打回了上面的头信息,无法更该便出错了。
代码2:开启了ob缓存,echo ‘php'时把要打给浏览器的数据先放到ob缓存里,之后又遇到一个头信息,也放入Ob缓存,页面结束时再按http协议到程序缓存后返回给浏览器。
为加深理解再看以下代码
代码3:

ob_start();
echo "php";
header("content-type:text/html;charset='utf-8'");
echo 'ok';
echo '<hr/>';
$ob=ob_get_contents();
echo $ob;

会输出

Php output buffering缓存及程序缓存深入解析

Ob_get_contents()只是取得ob缓存里的内容而不清楚它们
Ob_get_contents()必须在ob缓存没有清除前使用
代码4:

ob_start();
 echo "php";
 ob_clean();//清除缓存内容但不关闭缓存区,还能用(往里添加东西)
 header("content-type:text/html;charset='utf-8'");
 echo 'ok';
 echo '<hr/>';
 $ob=ob_get_contents();
 echo $ob;

结果:

Php output buffering缓存及程序缓存深入解析
代码5:

ob_start();
echo "php";
ob_end_clean();//清空缓存内容并关闭缓存区,ob_get_contents取不到内容
header("content-type:text/html;charset='utf-8'");
echo 'ok';
echo '<hr/>';
$ob=ob_get_contents();
echo $ob;

结果:

Php output buffering缓存及程序缓存深入解析
代码6:

ob_start();
echo "php";
ob_end_flush();//把缓存送到程序缓存内并关闭ob缓存
header("content-type:text/html;charset='utf-8'");
echo 'ok';
echo '<hr/>';
$ob=ob_get_contents();
echo $ob;

代码7:对比代码6  与ob_flush()比较
ob_start();
echo "php";
ob_flush();//把Ob 缓存送到程序缓存,不关闭ob缓存
header("content-type:text/html;charset='utf-8'");
echo 'ok';
echo '<hr/>';
$ob=ob_get_contents();
echo $ob;

结果:

Php output buffering缓存及程序缓存深入解析
Ob_clean()
清空ob缓存内容但不关闭
Ob_get_flush()
冲刷出缓存到程序缓存,关闭ob缓存
代码8:

Ob_start();
echo 'abc';
header("content-type:text/html;charset='utf-8'");
echo 'hello';
Ob_flush();
echo 'aa';
echo ob_get_contents();
//abchelloaaaa

2.ob_flush(),flush()与程序缓存
代码9:
ob_start();
echo 'a';
flush();//把Ob缓存冲刷到程序缓存再冲刷到浏览器输出,不影响ob缓存
echo ob_get_contents();
//aa

代码10:
ob_start();
echo 'a';
ob_flush();//把Ob缓存冲刷到程序缓存,ob里没有了缓存内容
echo "<br/>ob_con".ob_get_contents();
//a     是按正常输出的,Ob里没内容

程序缓存:
代码11:
echo str_repeat(" ",1024);//一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。 
for($i=0;$i<5;$i++){
echo $i;
echo "<br/>";
sleep(1);
flush();
}

会一秒输出一个数字
如果没有flush();会把所有的输出先暂存在程序缓存里,等完毕在整体返回给浏览器 这个例子说明了程序缓存
PHP 相关文章推荐
基于mysql的bbs设计(三)
Oct 09 PHP
一个捕获函数输出的函数
Feb 14 PHP
PHP 七大优势分析
Jun 23 PHP
PHP生成网页快照 不用COM不用扩展.
Feb 11 PHP
PHP求最大子序列和的算法实现
Jun 24 PHP
thinkphp备份数据库的方法分享
Jan 04 PHP
Yii安装与使用Excel扩展的方法
Jul 13 PHP
Nginx环境下PHP flush失效的解决方法
Oct 19 PHP
php array_map使用自定义的函数处理数组中的每个值
Oct 26 PHP
PHP精确到毫秒秒杀倒计时实例详解
Mar 14 PHP
Discuz不使用插件实现简单的打赏功能
Mar 21 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
Mar 18 PHP
PHP 转义使用详解
Jul 15 #PHP
thinkphp 一个页面使用2次分页的实现方法
Jul 15 #PHP
shell脚本作为保证PHP脚本不挂掉的守护进程实例分享
Jul 15 #PHP
PHP 伪静态技术原理以及突破原理实现介绍
Jul 12 #PHP
php的$_FILES的临时储存文件与回收机制实测过程
Jul 12 #PHP
php图像处理函数大全(推荐收藏)
Jul 11 #PHP
PHP 获取远程文件大小的3种解决方法
Jul 11 #PHP
You might like
php无限分类且支持输出树状图的详细介绍
2013/06/19 PHP
php获取CSS文件中图片地址并下载到本地的方法
2014/12/02 PHP
php获取远程文件内容的函数
2015/11/02 PHP
标准版Eclipse搭建PHP环境的详细步骤
2015/11/18 PHP
Yii框架上传图片用法总结
2016/03/28 PHP
php微信开发之批量生成带参数的二维码
2016/06/26 PHP
php版本CKEditor 4和CKFinder安装及配置方法图文教程
2019/06/05 PHP
javascript 禁止复制网页
2009/06/11 Javascript
javascript 强制刷新页面的实现代码
2009/12/13 Javascript
combox改进版 页面原型参考dojo的,比网上jQuery的那些combox功能强,代码更小
2010/04/15 Javascript
passwordStrength 基于jquery的密码强度检测代码使用介绍
2011/10/08 Javascript
jquery制作居中遮罩层效果分享
2014/02/21 Javascript
js匿名函数作为函数参数详解
2016/06/01 Javascript
Bootstrap学习笔记之css样式设计(1)
2016/06/07 Javascript
Kendo Grid editing 自定义验证报错提示的解决方法
2016/11/18 Javascript
javascript验证香港身份证的格式或真实性
2017/02/07 Javascript
Vue学习之路之登录注册实例代码
2017/07/06 Javascript
JS Testing Properties 判断属性是否在对象里的方法
2017/10/01 Javascript
Vue实现兄弟组件间的联动效果
2020/01/21 Javascript
微信小程序如何实现radio单选框单击打勾和取消
2020/01/21 Javascript
封装一下vue中的axios示例代码详解
2020/02/16 Javascript
基于JavaScript实现表格隔行换色
2020/05/08 Javascript
[58:35]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
python简单实现旋转图片的方法
2015/05/30 Python
对Python 3.5拼接列表的新语法详解
2018/11/08 Python
Python玩转Excel的读写改实例
2019/02/22 Python
django的403/404/500错误自定义页面的配置方式
2020/05/21 Python
python使用dlib进行人脸检测和关键点的示例
2020/12/05 Python
巴西补充剂和维生素购物网站:Natue
2019/06/17 全球购物
Carrs Silver官网:英国著名的银器品牌
2020/08/29 全球购物
详细的大学生创业计划书模板
2014/01/27 职场文书
安全检查汇报材料
2014/12/26 职场文书
检讨书格式
2015/01/23 职场文书
2015年端午节活动总结
2015/02/11 职场文书
教师教育心得体会
2016/01/19 职场文书
2016年公司“3.12”植树节活动总结
2016/03/16 职场文书