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 相关文章推荐
PHP三元运算符的结合性介绍
Jan 10 PHP
PHP中CURL的CURLOPT_POSTFIELDS参数使用细节
Mar 17 PHP
PHP采集类snoopy详细介绍(snoopy使用教程)
Jun 19 PHP
smarty半小时快速上手入门教程
Oct 27 PHP
php文件缓存类汇总
Nov 21 PHP
php使用Jpgraph创建柱状图展示年度收支表效果示例
Feb 15 PHP
php面向对象的用户登录身份验证
Jun 08 PHP
iis 7下安装laravel 5.4环境的方法教程
Jun 14 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
Jul 19 PHP
php 删除指定文件夹的实例讲解
Jul 25 PHP
php利用云片网实现短信验证码功能的示例代码
Nov 18 PHP
PHP实现微信公众号验证Token的示例代码
Dec 16 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
完美解决thinkphp验证码出错无法显示的方法
2014/12/09 PHP
PHP 9 大缓存技术总结
2015/09/17 PHP
Centos PHP 扩展Xchche的安装教程
2016/07/09 PHP
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
一端时间轮换的广告
2006/06/26 Javascript
理解Javascript_07_理解instanceof实现原理
2010/10/15 Javascript
javascript getElementsByTagName
2011/01/31 Javascript
javascript中注册和移除事件的4种方式
2013/03/20 Javascript
jQuery异步验证用户名是否存在示例代码
2014/05/21 Javascript
javascript实现漂亮的拖动层,窗口拖拽特效
2015/04/24 Javascript
jQuery实现简洁的导航菜单效果
2015/11/23 Javascript
分享javascript实现的冒泡排序代码并优化
2016/06/05 Javascript
jQuery Password Validation密码验证
2016/12/30 Javascript
js实现一键复制功能
2017/03/16 Javascript
利用jQuery+localStorage实现一个简易的计时器示例代码
2017/12/25 jQuery
JS实现验证码倒计时的注册页面
2018/01/02 Javascript
浅谈vuepress 踩坑记
2018/04/18 Javascript
详解redux异步操作实践
2018/08/15 Javascript
对layui中表单元素的使用详解
2018/08/15 Javascript
js实现数字从零慢慢增加到指定数字示例
2019/11/07 Javascript
js+css3实现炫酷时钟
2020/08/18 Javascript
jdk1.8+vue elementui实现多级菜单功能
2020/09/24 Javascript
[56:00]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第二场
2018/04/10 DOTA
[15:20]DOTA2-DPC中国联赛 正赛 Elephant vs Aster 选手采访
2021/03/11 DOTA
Python常见数据结构详解
2014/07/24 Python
Tornado Web服务器多进程启动的2个方法
2014/08/04 Python
python监控网站运行异常并发送邮件的方法
2015/03/13 Python
python如何求解两数的最大公约数
2018/09/27 Python
让Python脚本暂停执行的几种方法(小结)
2019/07/11 Python
Django框架 信号调度原理解析
2019/09/04 Python
Desigual美国官方网站:西班牙服装品牌
2019/03/29 全球购物
领导干部廉政承诺书
2014/03/27 职场文书
小学生竞选班干部演讲稿
2014/04/24 职场文书
优秀共产党员先进事迹材料
2014/05/06 职场文书
不服从公司安排检讨书
2014/09/24 职场文书
PHP连接MSSQL数据库案例,PHPWAMP多个PHP版本连接SQL Server数据库
2021/04/16 PHP