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 相关文章推荐
自动跳转中英文页面
Oct 09 PHP
使用PHP批量生成随机用户名
Jul 10 PHP
php下网站防IP攻击代码,超级实用
Oct 24 PHP
php表单提交问题的解决方法
Apr 12 PHP
php 无法加载mysql的module的时候的配置的解决方案引发的思考
Jan 27 PHP
php中的动态调用实例分析
Jan 07 PHP
php数组键名技巧小结
Feb 17 PHP
php检查字符串中是否包含7位GSM字符的方法
Mar 17 PHP
在PHP程序中使用Rust扩展的方法
Jul 03 PHP
PHP记录页面停留时间的方法
Mar 30 PHP
PHP实现的AES加密、解密封装类与用法示例
Aug 02 PHP
PHP中常见的密码处理方式和建议总结
Oct 14 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
2020显卡排行榜天梯图 显卡天梯图2020年3月最新版
2020/04/02 数码科技
PHP 上传文件的方法(类)
2009/07/30 PHP
Google Voice 短信发送接口PHP开源版(2010.5更新)
2010/07/22 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
2017/08/03 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
2020/03/23 PHP
ExtJs3.0中Store添加 baseParams 的Bug
2010/03/10 Javascript
浏览器常用高宽的jquery插件
2011/02/24 Javascript
jquery 实现二级/三级/多级联动菜单的思路及代码
2013/04/08 Javascript
基于 Docker 开发 NodeJS 应用
2014/07/30 NodeJs
jQuery中:file选择器用法实例
2015/01/04 Javascript
jQuery插件expander实现图片翻转特效
2015/05/21 Javascript
详解Node.js如何开发命令行工具
2016/08/14 Javascript
关于HTTP传输中gzip压缩的秘密探索分析
2018/01/12 Javascript
详解如何运行vue项目
2019/04/15 Javascript
使用 vue 实例更好的监听事件及vue实例的方法
2019/04/22 Javascript
layer弹出层倒计时关闭的实现方法
2019/09/27 Javascript
JavaScript实现单图片上传并预览功能
2019/09/30 Javascript
JS禁用右键、禁用Ctrl+u、禁用Ctrl+s、禁用F12的实现代码
2020/12/01 Javascript
vue移动端下拉刷新和上滑加载
2020/10/27 Javascript
Python中bisect的用法
2014/09/23 Python
Python中最大最小赋值小技巧(分享)
2017/12/23 Python
解决python 输出是省略号的问题
2018/04/19 Python
详解Python 协程的详细用法使用和例子
2018/06/15 Python
python利用插值法对折线进行平滑曲线处理
2018/12/25 Python
Python I/O与进程的详细讲解
2019/03/08 Python
Django中使用CORS实现跨域请求过程解析
2019/08/05 Python
pytorch实现mnist数据集的图像可视化及保存
2020/01/14 Python
python单例模式的应用场景实例讲解
2021/02/24 Python
澳大利亚床上用品、浴巾和家居用品购物网站:Bambury
2020/04/16 全球购物
企业精细化管理实施方案
2014/03/23 职场文书
本科生自荐信
2014/06/18 职场文书
银行进社区活动总结
2014/07/07 职场文书
党性锻炼的心得体会
2014/09/03 职场文书
2016年小学生新年寄语
2015/08/18 职场文书
MySQL中连接查询和子查询的问题
2021/09/04 MySQL
MySQL的存储过程和相关函数
2022/04/26 MySQL