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 相关文章推荐
怎样在UNIX系统下安装php3
Oct 09 PHP
php程序效率优化的一些策略小结
Jul 17 PHP
PHP常用技巧总结(附函数代码)
Feb 04 PHP
PHP调用VC编写的COM组件实例
Mar 29 PHP
解密ThinkPHP3.1.2版本之模板继承
Jun 19 PHP
PHP实现支付宝即时到账功能
Dec 21 PHP
PHP使用preg_split()分割特殊字符(元字符等)的方法分析
Feb 04 PHP
ThinkPHP防止重复提交表单的方法实例分析
May 10 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
Jun 13 PHP
PHP实现负载均衡session共享redis缓存操作示例
Aug 22 PHP
Laravel框架Auth用户认证操作实例分析
Sep 29 PHP
在 PHP 和 Laravel 中使用 Traits的方法
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性能的原理介绍
2012/09/05 PHP
php时间戳转换的示例
2014/03/31 PHP
ThinkPHP标签制作教程
2014/07/10 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
TP5(thinkPHP5框架)基于bootstrap实现的单图上传插件用法示例
2019/05/29 PHP
根据分辨率不同,调用不同的css文件
2006/07/07 Javascript
网页设计常用的一些技巧
2006/12/22 Javascript
读JavaScript DOM编程艺术笔记
2011/11/15 Javascript
原生JavaScript+LESS实现瀑布流
2014/12/12 Javascript
JS实现文字向下滚动完整实例
2015/02/06 Javascript
基于jquery ui的alert,confirm方案(支持换肤)
2015/04/03 Javascript
JS实现网页上随滚动条滚动的层效果代码
2015/11/04 Javascript
Asp.Net之JS生成分页条的方法
2016/11/23 Javascript
详解ElementUI之表单验证、数据绑定、路由跳转
2017/06/21 Javascript
使用vue-aplayer插件时出现的问题的解决
2018/03/02 Javascript
微信小程序功能之全屏滚动效果的实现代码
2018/11/22 Javascript
GOJS+VUE实现流程图效果
2018/12/01 Javascript
Vue批量图片显示时遇到的路径被解析问题
2019/03/28 Javascript
浅谈javascript中的prototype和__proto__的理解
2019/04/07 Javascript
python实现socket客户端和服务端简单示例
2014/02/24 Python
Django 浅谈根据配置生成SQL语句的问题
2018/05/29 Python
pyqt5对用qt designer设计的窗体实现弹出子窗口的示例
2019/06/19 Python
对python中的控制条件、循环和跳出详解
2019/06/24 Python
Django框架创建项目的方法入门教程
2019/11/04 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
2020/02/07 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
2020/03/12 Python
Python实现aes加密解密多种方法解析
2020/05/15 Python
全球知名巧克力品牌:Godiva
2016/07/22 全球购物
法人委托书范本
2014/04/04 职场文书
个人委托书
2014/07/31 职场文书
销售经理岗位职责
2015/01/31 职场文书
论语读书笔记
2015/06/26 职场文书
2019年干货:自我鉴定
2019/03/25 职场文书
PHP连接MSSQL数据库案例,PHPWAMP多个PHP版本连接SQL Server数据库
2021/04/16 PHP
如何利用Python实现一个论文降重工具
2021/07/09 Python
JavaScript实现九宫格拖拽效果
2022/06/28 Javascript