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 相关文章推荐
PHP+FLASH实现上传文件进度条相关文件 下载
Jul 21 PHP
php中文字母数字验证码实现代码
Apr 25 PHP
php简单开启gzip压缩方法(zlib.output_compression)
Apr 13 PHP
php unset全局变量运用问题的深入解析
Jun 17 PHP
PHP和javascript常用正则表达式及用法实例
Jul 01 PHP
PHP实现采集中国天气网未来7天天气
Oct 15 PHP
php实现简易聊天室应用代码
Sep 23 PHP
微信支付开发动态链接Native支付
Jul 12 PHP
php 微信开发获取用户信息如何实现
Dec 13 PHP
laravel如何开启跨域功能示例详解
Aug 31 PHP
tp5.1 框架路由操作-URL生成实例分析
May 26 PHP
让你的PHP,APACHE,NGINX支持大文件上传
Mar 09 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下使用SimpleXML 处理XML 文件
2010/02/27 PHP
php字符串操作常见问题小结
2016/10/11 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
Laravel实现通过blade模板引擎渲染视图
2019/10/25 PHP
JS保存和删除cookie操作 判断cookie是否存在
2013/11/13 Javascript
用JavaScript实现用一个DIV来包装文本元素节点
2014/09/09 Javascript
什么是 AngularJS?AngularJS简介
2014/12/06 Javascript
node.js中的path.extname方法使用说明
2014/12/09 Javascript
javaScript如何跳出多重循环break、continue
2016/09/01 Javascript
JavaScript实现解析INI文件内容的方法
2016/11/17 Javascript
详谈js原型继承的一些问题
2017/09/06 Javascript
关于vue中 $emit的用法详解
2018/04/12 Javascript
如何在Angular应用中创建包含组件方法示例
2019/03/23 Javascript
微信小程序网络层封装的实现(promise, 登录锁)
2019/05/08 Javascript
vue 解决数组赋值无法渲染在页面的问题
2019/10/28 Javascript
JavaScript多种滤镜算法实现代码实例
2019/12/10 Javascript
JavaScript实现点击切换验证码及校验
2021/01/10 Javascript
如何在vue中使用HTML 5 拖放API
2021/01/14 Vue.js
八大排序算法的Python实现
2021/01/28 Python
Python使用PIL库实现验证码图片的方法
2016/03/11 Python
基础的十进制按位运算总结与在Python中的计算示例
2016/06/28 Python
基于python 处理中文路径的终极解决方法
2018/04/12 Python
python爬取网易云音乐评论
2018/11/16 Python
对python xlrd读取datetime类型数据的方法详解
2018/12/26 Python
Python requests获取网页常用方法解析
2020/02/20 Python
python中count函数知识点浅析
2020/12/17 Python
python 下载文件的几种方法汇总
2021/01/06 Python
详解HTML5中的标签
2015/06/19 HTML / CSS
英国知名的护肤彩妆与时尚配饰大型综合零售电商:Unineed
2016/11/21 全球购物
Tom Dixon官网:英国照明及家具设计和制造公司
2019/03/01 全球购物
我的中国梦演讲稿600字
2014/08/19 职场文书
2014大四本科生自我鉴定总结
2014/10/04 职场文书
土建技术员岗位职责
2015/04/11 职场文书
采购内勤岗位职责
2015/04/13 职场文书
初中重阳节活动总结
2015/05/05 职场文书
2016年10月份红领巾广播稿
2015/12/21 职场文书