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邮件类
Jan 03 PHP
php smarty模版引擎中的缓存应用
Dec 02 PHP
PHP技术开发技巧分享
Mar 23 PHP
PHP strncasecmp字符串比较的小技巧
Jan 04 PHP
php在多维数组中根据键名快速查询其父键以及父键值的代码
May 07 PHP
浅析PHP原理之变量(Variables inside PHP)
Aug 09 PHP
php获取字段名示例分享
Mar 03 PHP
PHP链接MySQL的常用扩展函数
Oct 23 PHP
PHP封装CURL扩展类实例
Jul 28 PHP
Zend Framework基于Command命令行建立ZF项目的方法
Feb 18 PHP
php实现微信公众号企业转账功能
Oct 01 PHP
PHP mkdir创建文件夹实现方法解析
Nov 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 接口类与抽象类的实际作用
2009/11/26 PHP
ThinkPHP入库出现两次反斜线转义及数据库类转义的解决方法
2014/11/04 PHP
php查询mssql出现乱码的解决方法
2014/12/29 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
Javascript面象对象成员、共享成员变量实验
2010/11/19 Javascript
Js如何判断客户端是PC还是手持设备简单分析
2012/11/22 Javascript
5秒后跳转效果(setInterval/SetTimeOut)
2013/05/03 Javascript
JavaScript获取/更改文本框的值的实例代码
2013/08/02 Javascript
JS实现的左侧竖向滑动菜单效果代码
2015/10/19 Javascript
windows下vue-cli及webpack搭建安装环境
2017/04/25 Javascript
vue src动态加载请求获取图片的方法
2018/10/17 Javascript
layui动态绑定事件的方法
2019/09/20 Javascript
axios如何取消重复无用的请求详解
2019/12/15 Javascript
[01:29:17]RNG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
Python代码的打包与发布详解
2014/07/30 Python
Pyhton中防止SQL注入的方法
2015/02/05 Python
Linux 下 Python 实现按任意键退出的实现方法
2016/09/25 Python
使用Django Form解决表单数据无法动态刷新的两种方法
2017/07/14 Python
Python Web程序部署到Ubuntu服务器上的方法
2018/02/22 Python
python 用户交互输入input的4种用法详解
2019/09/24 Python
pytorch 实现cross entropy损失函数计算方式
2020/01/02 Python
解决python 执行sql语句时所传参数含有单引号的问题
2020/06/06 Python
django form和field具体方法和属性说明
2020/07/09 Python
django models里数据表插入数据id自增操作
2020/07/15 Python
巴西家用小家电购物网站:Polishop
2016/08/07 全球购物
Hanro官网:奢华男士和女士内衣、睡衣和家居服
2018/10/25 全球购物
Emma Bridgewater官网:英国餐具制造商
2019/11/24 全球购物
财务会计毕业生自荐信
2013/11/02 职场文书
教师节促销方案
2014/03/22 职场文书
教师产假请假条
2014/04/10 职场文书
安全生产月演讲稿
2014/05/09 职场文书
运动会拉拉队口号
2014/06/09 职场文书
中韩经贸翻译专业大学生职业生涯规划范文
2014/09/18 职场文书
2015秋季小学开学寄语
2015/05/27 职场文书
家长会开场白和结束语
2015/05/29 职场文书
详解Django的MVT设计模式
2021/04/29 Python