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 simplexmlElement操作xml的命名空间实现代码
Jan 04 PHP
php mb_substr()函数截取中文字符串应用示例
Jul 29 PHP
PHP实现的简单三角形、矩形周长面积计算器分享
Nov 18 PHP
thinkphp四种url访问方式详解
Nov 28 PHP
php限制文件下载速度的代码
Oct 20 PHP
php版微信发红包接口用法示例
Sep 23 PHP
AJAX的使用方法详解
Apr 29 PHP
PHP利用百度ai实现文本和图片审核
May 08 PHP
ThinkPHP框架结合Ajax实现用户名校验功能示例
Jul 03 PHP
laravel框架中表单请求类型和CSRF防护实例分析
Nov 23 PHP
PHP实现获取文件mime类型多种方法解析
May 28 PHP
用php实现分页效果的示例代码
Dec 10 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 header()函数使用说明
2008/07/10 PHP
PHP解压tar.gz格式文件的方法
2016/02/14 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
PHP自定义错误处理的方法分析
2018/12/19 PHP
php抽象类和接口知识点整理总结
2019/08/02 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
javascript中字符串拼接需注意的问题
2010/07/13 Javascript
JavaScript 的继承
2011/10/01 Javascript
通过jQuery源码学习javascript(二)
2012/12/27 Javascript
关于Javascript作用域链的八点总结
2013/12/06 Javascript
把jQuery的类、插件封装成seajs的模块的方法
2014/03/12 Javascript
深入理解JavaScript编程中的原型概念
2015/06/25 Javascript
AngularJS基础 ng-href 指令用法
2016/08/01 Javascript
浅谈jQuery before和insertBefore的区别
2016/12/04 Javascript
手机软键盘弹出时影响布局的解决方法
2016/12/15 Javascript
Angular的事件和表单详解
2016/12/26 Javascript
JS验证input输入框(字母,数字,符号,中文)
2017/03/23 Javascript
react开发中如何使用require.ensure加载es6风格的组件
2017/05/09 Javascript
BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
2017/08/07 Javascript
AjaxUpLoad.js实现文件上传
2018/03/05 Javascript
jQuery 获取除某指定对象外的其他对象 ( :not() 与.not())
2018/10/10 jQuery
[03:42]2014DOTA2西雅图国际邀请赛7月9日TOPPLAY
2014/07/09 DOTA
[39:53]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.19
2020/11/19 DOTA
Python获取当前页面内所有链接的四种方法对比分析
2017/08/19 Python
基于Python实现迪杰斯特拉和弗洛伊德算法
2020/05/27 Python
Python 保持登录状态进行接口测试的方法示例
2019/08/06 Python
python中dict()的高级用法实现
2019/11/13 Python
python 装饰器的使用示例
2020/10/10 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
2020/11/01 Python
英国床垫和床架购物网站:Bedman
2019/11/04 全球购物
潘多拉珠宝美国官方网站:Pandora US
2020/06/18 全球购物
职业生涯规划设计步骤
2014/01/12 职场文书
大学军训感想
2014/02/12 职场文书
保险公司客户经理岗位职责
2015/04/09 职场文书
nginx常用命令放入shell脚本详解
2021/03/31 Servers
python自动统计zabbix系统监控覆盖率的示例代码
2021/04/03 Python