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加密解密的代码
Oct 09 PHP
用PHP调用Oracle存储过程的方法
Sep 12 PHP
PHP生成excel时单元格内换行问题的解决方法
Aug 26 PHP
zend framework多模块多布局配置
Feb 26 PHP
PHP下打开phpMyAdmin出现403错误的问题解决方法
May 23 PHP
php利用新浪接口查询ip获取地理位置示例
Jan 20 PHP
PHP实现自动对图片进行滚动显示的方法
Mar 12 PHP
php简单备份与还原MySql的方法
May 09 PHP
PHP使用PHPExcel实现批量上传到数据库的方法
Jun 08 PHP
PHP基于Closure类创建匿名函数的方法详解
Aug 17 PHP
Laravel框架实现超简单的分页效果示例
Feb 08 PHP
Laravel Eloquent分表方法并使用模型关联的实现
Nov 25 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
DC游戏Steam周三特惠 《蝙蝠侠》阿卡姆系列平史低
2020/04/09 欧美动漫
php 错误处理经验分享
2011/10/11 PHP
php实现支付宝当面付(扫码支付)功能
2018/05/30 PHP
JavaScript Cookie 直接浏览网站分网址
2009/12/08 Javascript
js本身的局限性 别让javascript做太多事
2010/03/23 Javascript
jquery下jstree简单应用 - v1.0
2011/04/14 Javascript
js获取时间(本周、本季度、本月..)
2013/11/22 Javascript
javascript判断是否按回车键并解决浏览器之间的差异
2014/05/13 Javascript
简单谈谈javascript代码复用模式
2015/01/28 Javascript
解决jquery实现的radio重新选中的问题
2015/07/03 Javascript
javascript bom是什么及bom和dom的区别
2015/11/26 Javascript
jquery实现一个简单的表单验证实例
2016/03/30 Javascript
JS判断输入字符串长度实例代码(汉字算两个字符,字母数字算一个)
2016/08/02 Javascript
JavaScript中 this 指向问题深度解析
2017/02/21 Javascript
Bootstrap Multiselect 常用组件实现代码
2017/07/09 Javascript
微信公众号服务器验证Token步骤图解
2019/12/30 Javascript
Vue+Vant 图片上传加显示的案例
2020/11/03 Javascript
解决vant title-active-color与title-inactive-color不生效问题
2020/11/03 Javascript
Python实现视频下载功能
2017/03/14 Python
Python错误: SyntaxError: Non-ASCII character解决办法
2017/06/08 Python
Python调用C语言的方法【基于ctypes模块】
2018/01/22 Python
python docx 中文字体设置的操作方法
2018/05/08 Python
使用python对excle和json互相转换的示例
2018/10/23 Python
Python 3.8 新功能来一波(大部分人都不知道)
2020/03/11 Python
实例讲解Python 迭代器与生成器
2020/07/08 Python
python logging 重复写日志问题解决办法详解
2020/08/04 Python
全球航班旅行搜索网站:Cheapflights
2017/05/19 全球购物
美国领先的在线旅游网站:Orbitz
2018/11/05 全球购物
西班牙多品牌鞋店连锁店:Krack
2018/11/30 全球购物
英国领先的高级美容和在线皮肤诊所:Face the Future
2020/06/17 全球购物
信息专业本科生个人的自我评价
2013/10/28 职场文书
2015小学教师年度考核工作总结
2015/05/12 职场文书
80后创业总结的9条职场用人思想,记得收藏
2019/08/13 职场文书
解决pytorch 损失函数中输入输出不匹配的问题
2021/06/05 Python
mysql脏页是什么
2021/07/26 MySQL
如何使用 resize 实现图片切换预览功能
2021/08/23 HTML / CSS