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 06 PHP
PHP实例分享判断客户端是否使用代理服务器及其匿名级别
Jun 04 PHP
php实现兼容2038年后Unix时间戳转换函数
Mar 18 PHP
PHP贪婪算法解决0-1背包问题实例分析
Mar 23 PHP
php+ajax实现的点击浏览量加1
Apr 16 PHP
PHP获取Exif缩略图的方法
Jul 13 PHP
php实现json编码的方法
Jul 30 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
Nov 12 PHP
php+Ajax处理xml与json格式数据的方法示例
Mar 04 PHP
PHP __call()方法实现委托示例
May 20 PHP
PHP判断函数是否被定义的方法
Jun 21 PHP
Yii框架多语言站点配置方法分析【中文/英文切换站点】
Apr 07 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如何实现高效安全的ftp服务器(二)
2015/12/30 PHP
搭建PhpStorm+PhpStudy开发环境的超详细教程
2020/09/17 PHP
treepanel动态加载数据实现代码
2012/12/15 Javascript
基于IE下ul li 互相嵌套时的bug,排查,解决过程以及心得介绍
2013/05/07 Javascript
JS限制Textarea文本域字符个数的具体实现
2013/08/02 Javascript
JavaScript对内存分配及管理机制详细解析
2013/11/11 Javascript
JavaScript输入邮箱自动提示实例代码
2014/01/13 Javascript
Bootstrap每天必学之简单入门
2015/11/19 Javascript
深入理解requestAnimationFrame的动画循环
2016/09/20 Javascript
详解nodejs 文本操作模块-fs模块(二)
2016/12/22 NodeJs
使用BootStrap实现表格隔行变色及hover变色并在需要时出现滚动条
2017/01/04 Javascript
Vue.js列表渲染绑定jQuery插件的正确姿势
2017/06/29 jQuery
node.js的exports、module.exports与ES6的export、export default深入详解
2017/10/26 Javascript
JS异步处理的进化史深入讲解
2019/08/25 Javascript
解决Vue打包上线之后部分CSS不生效的问题
2019/11/12 Javascript
Vue学习之常用指令实例详解
2020/01/06 Javascript
JS实现电脑虚拟键盘打字测试
2020/06/24 Javascript
利用React高阶组件实现一个面包屑导航的示例
2020/08/23 Javascript
Python列表计数及插入实例
2014/12/17 Python
python使用xlrd实现检索excel中某列含有指定字符串记录的方法
2015/05/09 Python
使用Python的Tornado框架实现一个Web端图书展示页面
2016/07/11 Python
Python二叉树的定义及常用遍历算法分析
2017/11/24 Python
python清除字符串前后空格函数的方法
2018/10/21 Python
Python数据集切分实例
2018/12/08 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
2019/12/19 Python
Python创建空列表的字典2种方法详解
2020/02/13 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
2020/03/14 Python
使用python-cv2实现视频的分解与合成的示例代码
2020/10/26 Python
Crocs美国官方网站:卡骆驰洞洞鞋
2017/08/04 全球购物
中专毕业生自我鉴定范文
2013/11/09 职场文书
客服主管岗位职责
2013/12/13 职场文书
化学专业毕业生求职信
2014/07/28 职场文书
违反交通法规检讨书
2014/09/10 职场文书
论群众路线学习笔记
2014/11/06 职场文书
导游词之苏州盘门景区
2019/11/12 职场文书
JavaScript数组reduce()方法的语法与实例解析
2021/07/07 Javascript