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 相关文章推荐
NOT NULL 和NULL
Jan 15 PHP
自动生成文章摘要的代码[PHP 版本]
Mar 20 PHP
解析coreseek for sphinx的使用
Jun 21 PHP
PHP分页详细讲解(有实例)
Oct 30 PHP
PHP PDOStatement:bindParam插入数据错误问题分析
Nov 13 PHP
php二维数组转成字符串示例
Feb 17 PHP
PHP Warning: Module 'modulename' already loaded in问题解决办法
Mar 16 PHP
PHP+Mysql+jQuery中国地图区域数据统计实例讲解
Oct 10 PHP
简单实现PHP留言板功能
Dec 21 PHP
/etc/php-fpm.d/www.conf 配置注意事项
Feb 04 PHP
PHP实现QQ登录的开原理和实现过程
Feb 04 PHP
thinkPHP5使用Rabc实现权限管理
Aug 28 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+MySql编写聊天室
2006/10/09 PHP
Yii学习总结之数据访问对象 (DAO)
2015/02/22 PHP
php将字符串转换成16进制的方法
2015/03/17 PHP
ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写方法
2018/09/26 PHP
javascript 自定义事件初探
2009/08/21 Javascript
jquery js 重置表单 reset()具体实现代码
2013/08/05 Javascript
js单独获取一个checkbox看其是否被选中
2014/09/22 Javascript
JS禁用页面上所有控件的实现方法(附demo源码下载)
2015/12/17 Javascript
理解javascript中try...catch...finally
2015/12/25 Javascript
简单实现jQuery进度条轮播实例代码
2016/06/20 Javascript
javascript工厂模式和构造函数模式创建对象方法解析
2016/12/30 Javascript
BootStrap栅格系统、表单样式与按钮样式源码解析
2017/01/20 Javascript
jQuery实现的响应鼠标移动方向插件用法示例【附源码下载】
2018/08/28 jQuery
vue实现的下拉框功能示例
2019/01/29 Javascript
js实现弹出框的拖拽效果实例代码详解
2019/04/16 Javascript
浅谈TypeScript的类型保护机制
2020/02/23 Javascript
vue form表单post请求结合Servlet实现文件上传功能
2021/01/22 Vue.js
[02:41]辉夜杯现场一家三口 “我爸玩风行 我玩血魔”
2015/12/27 DOTA
python爬虫之BeautifulSoup 使用select方法详解
2017/10/23 Python
Python实现将数据写入netCDF4中的方法示例
2018/08/30 Python
pandas 时间格式转换的实现
2019/07/06 Python
Windows10下 python3.7 安装 facenet的教程
2019/09/10 Python
python如何使用jt400.jar包代码实例
2019/12/20 Python
python+opencv3生成一个自定义纯色图教程
2020/02/19 Python
Python使用sqlite3模块内置数据库
2020/05/07 Python
selenium设置浏览器为headless无头模式(Chrome和Firefox)
2021/01/08 Python
澳大利亚波希米亚风时尚品牌:Tree of Life
2019/09/15 全球购物
质检员的岗位职责
2013/11/15 职场文书
仓管员岗位责任制
2014/02/19 职场文书
绵山导游词
2015/02/05 职场文书
超强台风观后感
2015/06/09 职场文书
婚礼伴郎致辞
2015/07/28 职场文书
大学生支教感言
2015/08/01 职场文书
工作感想范文
2015/08/07 职场文书
python中__slots__节约内存的具体做法
2021/07/04 Python
MySQL配置主从服务器(一主多从)
2021/08/07 MySQL