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 相关文章推荐
论坛头像随机变换代码
Oct 09 PHP
php的memcached客户端memcached
Jun 14 PHP
PHP在线生成二维码代码(google api)
Jun 03 PHP
PHP Opcache安装和配置方法介绍
May 28 PHP
PHP封装CURL扩展类实例
Jul 28 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
Aug 28 PHP
PHP简单判断手机设备的方法
Aug 23 PHP
PHP对象克隆clone用法示例
Sep 28 PHP
Yii2 如何在modules中添加验证码的方法
Jun 19 PHP
PHP模版引擎原理、定义与用法实例
Mar 29 PHP
使用PHPWord生成word文档的方法详解
Jun 06 PHP
PHP的JSON封装、转变及输出操作示例
Sep 27 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
漂亮但不安全的CTB
2006/10/09 PHP
php radio 单选框获取与保持值的实现代码
2010/05/15 PHP
ThinkPHP实现多数据库连接的解决方法
2014/07/01 PHP
javascript preload&amp;lazy load
2010/05/13 Javascript
3分钟写出来的Jquery版checkbox全选反选功能
2013/10/23 Javascript
利用JS进行图片的切换即特效展示图片
2013/12/03 Javascript
javascript 面向对象封装与继承
2014/11/27 Javascript
jQuery实现列表内容的动态载入特效
2015/08/08 Javascript
HTML5canvas 绘制一个圆环形的进度表示实例
2016/12/16 Javascript
Bootstrap模态框案例解析
2017/03/05 Javascript
JS实现多张图片预览同步上传功能
2017/06/23 Javascript
js实时监控文本框输入字数的实例代码
2018/01/18 Javascript
详解node.js的http模块实例演示
2018/07/12 Javascript
ES6的Fetch异步请求的实现方法
2018/12/07 Javascript
浅谈VueJS SSR 后端绘制内存泄漏的相关解决经验
2018/12/20 Javascript
微信小程序实现订单倒计时
2020/11/01 Javascript
关于vue2强制刷新,解决页面不会重新渲染的问题
2019/10/29 Javascript
vue实现在线预览pdf文件和下载(pdf.js)
2019/11/26 Javascript
JavaScript 接口原理与用法实例详解
2020/05/12 Javascript
jQuery AJAX应用实例总结
2020/05/19 jQuery
Python简单连接MongoDB数据库的方法
2016/03/15 Python
Python使用asyncio包处理并发详解
2017/09/09 Python
Python中出现IndentationError:unindent does not match any outer indentation level错误的解决方法
2020/04/18 Python
Python PIL图片添加字体的例子
2019/08/22 Python
python多线程高级锁condition简单用法示例
2019/11/07 Python
不同浏览器创建XMLHttpRequest方法有什么不同
2014/11/17 面试题
财务管理专业毕业生求职信范文
2013/09/21 职场文书
便利店投资的创业计划书
2014/01/12 职场文书
开业典礼主持词
2014/03/21 职场文书
学校端午节活动方案
2014/08/23 职场文书
2015年重阳节活动总结
2015/03/24 职场文书
2015年财务部工作总结
2015/04/10 职场文书
2015年乡镇妇联工作总结
2015/05/19 职场文书
教师远程培训心得体会
2016/01/09 职场文书
《乘法分配律》教学反思
2016/02/24 职场文书
最新农村养殖致富:资金投入较低的创业项目有哪些?
2019/09/26 职场文书