PHP缓存机制Output Control详解


Posted in PHP onJuly 14, 2014

在php5.2版本的配置中,默认output_buffering为关闭状态,因此运行下面三行代码将会出现一个警告:
Warning: Cannot modify header information - headers already sent

echo 'hello1';
header('content-type:text/html;charset=utf-8');
echo 'hello2';

开启OB缓存的方式有如下两种:

1. php.ini中开启 output_buffering = 4096

启用了此指令,那么每个PHP脚本都相当于一开始就调用了ob_start()函数,PHP5.5默认已开启output_buffering = 4096

2. 直接在程序中使用 ob_start();

打开输出缓冲。当输出缓冲激活后,脚本将不会输出内容(除http标头外),相反需要输出的内容被存储在内部缓冲区中。

内部缓冲区的内容可以用 ob_get_contents() 函数复制到一个字符串变量中。 想要输出存储在内部缓冲区中的内容,可以使用 ob_end_flush() 函数。另外, 使用 ob_end_clean() 函数会静默丢弃掉缓冲区的内容。

/**
 * output_buffering = off 情况下测试
 */
ob_start();  //开启ob缓存
echo 'hello1'; //存入ob缓存
header('content-type:text/html;charset=utf-8');//存入程序缓存
//ob_end_clean(); //清空ob缓存,并关闭ob缓存
echo 'hello2'; //存入ob缓存
$str = ob_get_contents(); //返回ob缓存的数据(不清除缓冲内容)
file_put_contents('ob.txt', $str); //把$str保存到文件
//ob_clean(); //清空ob缓存
echo 'hello3'; //存入ob缓存
echo 'hello4'; //存入ob缓存
/* 此脚本将生成ob.txt文件,存入hello1hello2,浏览器输出hello1hello2hello3hello4 */
/* 若ob_clean()注释打开,那么生成的ob.txt文件中将没有内容,浏览器输出hello3hello4 */
/* 若ob_end_clean()注释打开,那么ob.txt中依然没有内容,因为关闭了ob缓存,浏览器输出hello2hello3hello4 */

ob_flush() 与 ob_end_flush() 例子:

ob_start();
echo 'abc';//存入ob缓存
header('content-type:text/html;charset=utf-8'); //存入程序缓存
echo 'hello'; //存入ob缓存
ob_flush();//将ob缓存中的内容输出到程序缓存,清空ob缓存,不关闭ob缓存
//ob_end_flush() //将ob缓存中的内容输出到程序缓存,清空ob缓存,关闭ob缓存
echo 'aa'; //存入ob缓存
echo ob_get_contents();
/* 最后输出abchelloaaaa */
/* 注释ob_flush,打开ob_end_flush,最后输出abchelloaa */

注意:
在output_buffering = 4096开启的情况下,ob_end_clean()只关闭一次ob缓存(即ob_start开启的),系统的并未关闭。
ob_end_flush()同理。

OB缓存的运行原理/原则:

1. ob缓存打开,echo的数据首先放入ob缓存
2. 如果是header信息,直接放在程序缓存
3. 当页面执行到最后,会把ob缓存的数据放到程序缓存,然后一次返回给浏览器

最后还有一个flush(); 强制刷新PHP程序缓存到浏览器缓存。

特性:一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。

echo str_repeat('', 1024);//重复输出多个字符(解决浏览器缓存256字节之后再输出的情况)
for($i=0; $i < 5; $i++)
{
  echo $i;
  flush();    //强制刷新程序缓存到浏览器缓存
  sleep(1);    //休眠1秒钟,http连接未断开,每隔1秒输出$i
}
PHP 相关文章推荐
jQuery 源码分析笔记
May 25 PHP
php事务处理实例详解
Jul 11 PHP
自编函数解决pathinfo()函数处理中文问题
Nov 03 PHP
php动态生成版权所有信息的方法
Mar 24 PHP
PHP将MySQL的查询结果转换为数组并用where拼接的示例
May 13 PHP
php socket通信简单实现
Nov 18 PHP
php PDO实现的事务回滚示例
Mar 23 PHP
PHP实现类似于C语言的文件读取及解析功能
Sep 01 PHP
php实现的后台表格分页功能示例
Oct 23 PHP
thinkPHP5框架自定义验证器实现方法分析
Jun 11 PHP
微信公众号实现扫码获取微信用户信息(网页授权)
Apr 09 PHP
laravel5.6 框架操作数据 Eloquent ORM用法示例
Jan 26 PHP
PHP生成指定长度随机数最简洁的方法
Jul 14 #PHP
PHP下通过QRCode类库创建中间带网站LOGO的二维码
Jul 12 #PHP
PHP实现获取图片颜色值的方法
Jul 11 #PHP
PHP基于php_imagick_st-Q8.dll实现JPG合成GIF图片的方法
Jul 11 #PHP
php事务处理实例详解
Jul 11 #PHP
PHP实现显示照片exif信息的方法
Jul 11 #PHP
php中json_encode处理gbk与gb2312中文乱码问题的解决方法
Jul 10 #PHP
You might like
PHP+Ajax验证码验证用户登录
2016/07/20 PHP
Symfony2创建基于域名的路由相关示例
2016/11/14 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
编写针对IE的JS代码两种编写方法
2013/01/30 Javascript
HTML页面登录时的JS验证方法
2014/05/28 Javascript
javascript顺序加载图片的方法
2015/07/18 Javascript
Javascript操作dom对象之select全面解析
2017/04/24 Javascript
jQuery结合jQuery.cookie.js插件实现换肤功能示例
2017/10/14 jQuery
vue-router项目实战总结篇
2018/02/11 Javascript
vue webpack实用技巧总结
2018/04/24 Javascript
vue弹窗消息组件的使用方法
2020/09/24 Javascript
Vue实现textarea固定输入行数与添加下划线样式的思路详解
2018/06/28 Javascript
一次Webpack配置文件的分离实战记录
2018/11/30 Javascript
validform表单验证的实现方法
2019/03/08 Javascript
iphone刘海屏页面适配方法
2019/05/07 Javascript
Vue 自定义指令实现一键 Copy功能
2019/09/16 Javascript
webpack的 rquire.context用法实现工程自动化的方法
2020/02/07 Javascript
JavaScript array常用方法代码实例详解
2020/09/02 Javascript
[34:39]Secret vs VG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
python实现调用其他python脚本的方法
2014/10/05 Python
scrapy自定义pipeline类实现将采集数据保存到mongodb的方法
2015/04/16 Python
Python基于OpenCV实现视频的人脸检测
2018/01/23 Python
python 叠加等边三角形的绘制的实现
2019/08/14 Python
pandas处理csv文件的方法步骤
2020/10/16 Python
Python实现Appium端口检测与释放的实现
2020/12/31 Python
HTML5之WebGL 3D概述(上)—WebGL原生开发开启网页3D渲染新时代
2013/01/31 HTML / CSS
HTML5 视频播放(video),JavaScript控制视频的实例代码
2018/10/08 HTML / CSS
数据库笔试题
2013/05/09 面试题
在职研究生自我鉴定
2013/10/16 职场文书
师范大学应届生求职信
2013/11/21 职场文书
岗位明星事迹材料
2014/05/18 职场文书
教育局党的群众路线教育实践活动整改方案
2014/09/20 职场文书
代办社保委托书范文
2014/10/06 职场文书
骆驼祥子读书笔记
2015/06/26 职场文书
网吧温馨提示
2015/07/17 职场文书
升学宴学生致辞
2015/09/29 职场文书