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 5.0 Pear安装方法
Dec 06 PHP
解析PayPal支付接口的PHP开发方式
Nov 28 PHP
php操作mysqli(示例代码)
Oct 28 PHP
ThinkPHP之getField详解
Jun 20 PHP
php使用Cookie控制访问授权的方法
Jan 21 PHP
PHP中isset与array_key_exists的区别实例分析
Jun 02 PHP
PHPExcel笔记, mpdf导出
May 03 PHP
thinkPHP数据查询常用方法总结【select,find,getField,query】
Mar 15 PHP
微信封装的调用微信签名包的类库
Jun 08 PHP
PHP回调函数概念与用法实例分析
Nov 03 PHP
php获取微信基础接口凭证Access_token
Aug 23 PHP
php使用pecl方式安装扩展操作示例
Aug 12 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
PHP5.0正式发布 不完全兼容PHP4 新增多项功能
2006/10/09 PHP
用PHP的ob_start() 控制您的浏览器cache
2009/08/03 PHP
php生成局部唯一识别码LUID的代码
2012/10/06 PHP
微信公众号开发之微信公共平台消息回复类实例
2014/11/14 PHP
php获取图片信息的方法详解
2015/12/10 PHP
php验证码生成器
2017/05/24 PHP
PHP实现权限管理功能示例
2017/09/22 PHP
jscript之List Excel Color Values
2007/06/13 Javascript
javascript高亮效果的二种实现方法
2008/09/14 Javascript
根据选择不同的下拉值出现相对应的文本输入框
2013/08/01 Javascript
JS获取select的value和text值的简单实例
2014/02/26 Javascript
使用jQuery实现星级评分代码分享
2014/12/09 Javascript
Jquery uploadify上传插件使用详解
2016/01/13 Javascript
微信小程序 action-sheet底部菜单详解
2016/10/27 Javascript
基于bootstrap-datetimepicker.js不支持IE8的快速解决方法
2016/11/07 Javascript
js replace()去除代码中空格的实例
2017/02/14 Javascript
taro开发微信小程序的实践
2019/05/21 Javascript
详解node.js 事件循环
2020/07/22 Javascript
Python入门篇之字符串
2014/10/17 Python
python中日期和时间格式化输出的方法小结
2015/03/19 Python
python 基础教程之Map使用方法
2017/01/17 Python
Python基础知识_浅谈用户交互
2017/05/31 Python
python 函数内部修改外部变量的方法
2018/12/18 Python
Python 输出时去掉列表元组外面的方括号与圆括号的方法
2018/12/24 Python
PyCharm Anaconda配置PyQt5开发环境及创建项目的教程详解
2020/03/24 Python
CSS3中currentColor关键字的妙用
2016/02/27 HTML / CSS
Monnier Frères美国官网:法国知名奢侈品网站
2016/11/22 全球购物
女方婚礼新郎答谢词
2014/01/11 职场文书
煤矿安全协议书
2014/08/20 职场文书
辩论赛开场白大全(主持人+辩手)
2015/05/29 职场文书
生日寿星公答谢词
2015/09/29 职场文书
初中教务主任竞聘演讲稿(范文)
2019/08/20 职场文书
导游词之澳门妈祖庙
2019/12/19 职场文书
解决sql server 数据库,sa用户被锁定的问题
2021/06/11 SQL Server
javascript之Object.assign()的痛点分析
2022/03/03 Javascript
面试官问我Mysql的存储引擎了解多少
2022/08/05 MySQL