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&amp;mysql(五)
Oct 09 PHP
PHP连接access数据库
Mar 27 PHP
解析ajax事件的调用顺序
Jun 17 PHP
codeigniter使用技巧批量插入数据实例方法分享
Dec 31 PHP
PHP包含文件函数include、include_once、require、require_once区别总结
Apr 05 PHP
php实现水仙花数的4个示例分享
Apr 08 PHP
php合并数组中相同元素的方法
Nov 13 PHP
推荐10个提供免费PHP脚本下载的网站
Dec 31 PHP
php使用递归函数实现数字累加的方法
Mar 16 PHP
给WordPress的编辑后台添加提示框的代码实例分享
Dec 25 PHP
PHP中Laravel 关联查询返回错误id的解决方法
Apr 01 PHP
Laravel 5.4重新登录实现跳转到登录前页面的原理和方法
Jul 13 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几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
2013/06/06 PHP
PHP中使用glob函数实现一句话删除某个目录下的所有文件
2014/07/22 PHP
PHP实现基于PDO扩展连接PostgreSQL对象关系数据库示例
2018/03/31 PHP
Laravel5.4框架使用socialite实现github登录的方法
2019/03/20 PHP
jquery入门——事件机制之事件中的冒泡现象示例解释
2020/09/12 Javascript
jquery的ajax请求全面了解
2013/03/20 Javascript
jQuery之选择组件的深入解析
2013/06/19 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/08/22 Javascript
jQuery的css() 方法使用指南
2015/05/03 Javascript
javascript截图 jQuery插件imgAreaSelect使用详解
2016/05/04 Javascript
JS拉起或下载app的实现代码
2017/02/22 Javascript
jQuery实现选项卡功能(两种方法)
2017/03/08 Javascript
nodejs中模块定义实例详解
2017/03/18 NodeJs
JavaScript事件方法(实例讲解)
2017/06/27 Javascript
AngularJS通过ng-Img-Crop实现头像截取的示例
2017/08/17 Javascript
vue实现文章内容过长点击阅读全文功能的实例
2017/12/28 Javascript
详解vue2.0模拟后台json数据
2019/05/16 Javascript
通过vue手动封装on、emit、off的代码详解
2019/05/29 Javascript
详解JSON.stringify()的5个秘密特性
2020/05/26 Javascript
快速解决vue2+vue-cli3项目ie兼容的问题
2020/11/17 Vue.js
浅析VUE防抖与节流
2020/11/24 Vue.js
[01:04:49]KG vs LGD 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python提取PDF内容的方法(文本、图像、线条等)
2019/09/25 Python
python内置函数sorted()用法深入分析
2019/10/08 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
2020/07/01 Python
Python pexpect模块及shell脚本except原理解析
2020/08/03 Python
python 基于Apscheduler实现定时任务
2020/12/15 Python
美国婴儿和儿童服装购物网站:PatPat
2020/10/01 全球购物
Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
2015/08/04 面试题
幼师自荐信范文
2013/10/06 职场文书
生产部主管岗位职责
2014/01/06 职场文书
快餐公司创业计划书
2014/04/29 职场文书
教师自我剖析材料范文
2014/09/30 职场文书
歼十出击观后感
2015/06/11 职场文书
在职证明书模板
2015/06/15 职场文书
vue组件vue-esign实现电子签名
2022/04/21 Vue.js