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 UTF8编码内的繁简转换类
Jul 20 PHP
PHP数组实例总结与说明
Aug 23 PHP
关于查看MSSQL 数据库 用户每个表 占用的空间大小
Jun 21 PHP
php上传文件中文文件名乱码的解决方法
Nov 01 PHP
php网站判断用户是否是手机访问的方法
Nov 01 PHP
ini_set的用法介绍
Jan 07 PHP
php使用curl检测网页是否被百度收录的示例分享
Jan 31 PHP
php实现阿拉伯数字和罗马数字相互转换的方法
Apr 17 PHP
PHP的serialize序列化数据以及JSON格式化数据分析
Oct 10 PHP
PHP7下协程的实现方法详解
Dec 17 PHP
PHP+Apache实现二级域名之间共享cookie的方法
Jul 24 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
Feb 21 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设计模式之单例模式使用示例
2014/01/20 PHP
Nginx环境下PHP flush失效的解决方法
2016/10/19 PHP
PHP+Ajax实现的无刷新分页功能详解【附demo源码下载】
2017/07/03 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
简略的前端架构心得&amp;&amp;基于editor为例子的编码小技巧
2010/11/25 Javascript
IE6/7 and IE8/9/10(IE7模式)依次隐藏具有absolute或relative的父元素和子元素后再显示父元素
2011/07/31 Javascript
Javascript基础 函数“重载” 详细介绍
2013/10/25 Javascript
在javascript中执行任意html代码的方法示例解读
2013/12/25 Javascript
jQuery获取动态生成的元素示例
2014/06/15 Javascript
Bootstrap实现水平排列的表单
2016/07/04 Javascript
Actionscript与javascript交互实例程序(修改)
2016/09/22 Javascript
Javascript使用SWFUpload进行多文件上传
2016/11/16 Javascript
AngularJS实现根据不同条件显示不同控件
2017/04/20 Javascript
BootStrap Fileinput上传插件使用实例代码
2017/07/28 Javascript
JS实现的简单四则运算计算器功能示例
2017/09/27 Javascript
vue检测对象和数组的变化分析
2018/06/30 Javascript
webuploader分片上传的实现代码(前后端分离)
2018/09/10 Javascript
浅析微信扫码登录原理(小结)
2018/10/29 Javascript
原生JS forEach()和map()遍历的区别、兼容写法及jQuery $.each、$.map遍历操作
2019/02/27 jQuery
浅谈js闭包理解
2019/04/01 Javascript
vue 全局环境切换问题
2019/10/27 Javascript
JS字符串补全方法padStart()和padEnd()
2020/05/27 Javascript
vue操作dom元素的3种方法示例
2020/09/20 Javascript
Python 错误和异常小结
2013/10/09 Python
python执行shell获取硬件参数写入mysql的方法
2014/12/29 Python
python装饰器初探(推荐)
2016/07/21 Python
Python基础教程之浅拷贝和深拷贝实例详解
2017/07/15 Python
Python中XlsxWriter模块简介与用法分析
2018/04/24 Python
python 删除字符串中连续多个空格并保留一个的方法
2018/12/22 Python
详解Python装饰器
2019/03/25 Python
Python利用requests模块下载图片实例代码
2019/08/12 Python
使用tensorboard可视化loss和acc的实例
2020/01/21 Python
HTML5 Canvas鼠标与键盘事件demo示例
2013/07/04 HTML / CSS
CSMA/CD介质访问控制协议
2015/11/17 面试题
同事吵架检讨书
2014/02/05 职场文书
信用卡逾期证明示例
2014/09/13 职场文书