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 单引号与双引号的区别
Nov 24 PHP
用PHP ob_start()控制浏览器cache、生成html实现代码
Feb 16 PHP
深入分析php中接口与抽象类的区别
Jun 08 PHP
处理(php-cgi.exe - FastCGI 进程超过了配置的请求超时时限)的问题
Jul 03 PHP
Yii实现多数据库主从读写分离的方法
Dec 29 PHP
PHP判断IP并转跳到相应城市分站的方法
Mar 25 PHP
PHP执行linux命令常用函数汇总
Feb 02 PHP
基于CI框架的微信网页授权库示例
Nov 25 PHP
php实现统计二进制中1的个数算法示例
Jan 23 PHP
php生成微信红包数组的方法
Sep 05 PHP
PHP 计算两个时间段之间交集的天数示例
Oct 24 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
Mar 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
基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解
2013/05/15 PHP
解析PHP提交后跳转
2013/06/23 PHP
解析Extjs与php数据交互(增删查改)
2013/06/25 PHP
浅析Mysql 数据回滚错误的解决方法
2013/08/05 PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
2016/07/20 PHP
php解析mht文件转换成html的实例
2017/03/13 PHP
网页中CDATA标记的说明
2010/09/12 Javascript
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
2012/07/31 Javascript
jquery的ajax()函数传值中文乱码解决方法介绍
2012/11/08 Javascript
jQuery语法总结和注意事项小结
2012/11/11 Javascript
js不能获取隐藏的div的宽度只能先显示后获取
2014/09/04 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
2016/07/07 Javascript
Vue2.0 组件传值通讯的示例代码
2017/08/01 Javascript
vue-resource + json-server模拟数据的方法
2017/11/02 Javascript
javascript写一个ajax自动拦截并下载数据代码实例
2019/09/07 Javascript
layui原生表单验证的实例
2019/09/09 Javascript
Django中实现一个高性能计数器(Counter)实例
2014/07/09 Python
常见的python正则用法实例讲解
2016/06/21 Python
pandas apply 函数 实现多进程的示例讲解
2018/04/20 Python
python实现pdf转换成word/txt纯文本文件
2018/06/07 Python
python django 原生sql 获取数据的例子
2019/08/14 Python
浅谈python 类方法/静态方法
2020/09/18 Python
Python爬虫之Selenium多窗口切换的实现
2020/12/04 Python
CSS3教程(10):CSS3 HSL声明设置颜色
2009/04/02 HTML / CSS
介绍一下linux的文件系统
2012/03/20 面试题
大学辅导员事迹材料
2014/02/05 职场文书
葬礼司仪主持词
2014/03/31 职场文书
门店业绩提升方案
2014/06/08 职场文书
民族团结好少年事迹材料
2014/08/19 职场文书
校长师德师风自我剖析材料
2014/09/29 职场文书
搭讪开场白台词大全
2015/05/28 职场文书
惊涛骇浪观后感
2015/06/05 职场文书
导游带团欢迎词
2015/09/30 职场文书
读《教育心理学》心得体会
2016/01/22 职场文书
Redis入门教程详解
2021/08/30 Redis
腾讯云服务器部署前后分离项目之前端部署
2022/06/28 Servers