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对接微信公众平台消息接口开发流程教程
Mar 25 PHP
PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
Jun 19 PHP
ThinkPHP单字母函数(快捷方法)使用总结
Jul 23 PHP
php实现ip白名单黑名单功能
Mar 12 PHP
php实现html标签闭合检测与修复方法
Jul 09 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
May 17 PHP
PHP中Socket连接及读写数据超时问题分析
Jul 19 PHP
PHP中include()与require()的区别说明
Feb 14 PHP
PHP微信模板消息操作示例
Jun 29 PHP
laravel批量生成假数据的方法
Oct 09 PHP
浅谈Laravel模板实体转义带来的坑
Oct 22 PHP
php ActiveMQ的安装与使用方法图文教程
Feb 23 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具体实现代码
2010/10/12 PHP
php中eval函数的危害与正确禁用方法
2014/06/30 PHP
php使用pdo连接并查询sql数据库的方法
2014/12/24 PHP
artDialog双击会关闭对话框的修改过程分享
2013/08/05 Javascript
如何在JavaScript中实现私有属性的写类方式(一)
2013/12/04 Javascript
jQuery获取选中内容及设置元素属性的方法
2014/07/09 Javascript
JavaScript实现快速排序的方法
2015/07/31 Javascript
jQuery使用eraser.js插件实现擦除、刮刮卡效果的方法【附eraser.js下载】
2017/04/28 jQuery
详谈js原型继承的一些问题
2017/09/06 Javascript
jQuery实现的文字逐行向上间歇滚动效果示例
2017/09/06 jQuery
在vue里面设置全局变量或数据的方法
2018/03/09 Javascript
200行代码实现blockchain 区块链实例详解
2018/03/14 Javascript
js获取form表单中name属性的值
2019/02/27 Javascript
简谈创建React Component的几种方式
2019/06/15 Javascript
layui实现三级联动效果
2019/07/26 Javascript
JointJS JavaScript流程图绘制框架解析
2019/08/15 Javascript
vue中实现拖动调整左右两侧div的宽度的示例代码
2020/07/22 Javascript
Python中类的继承代码实例
2014/10/28 Python
Python使用filetype精确判断文件类型
2017/07/02 Python
Face++ API实现手势识别系统设计
2018/11/21 Python
python 实现分页显示从es中获取的数据方法
2018/12/26 Python
Python实用库 PrettyTable 学习笔记
2019/08/06 Python
MoviePy简介及Python视频剪辑自动化
2020/12/18 Python
HTML5之tabindex属性全面解析
2016/07/07 HTML / CSS
香港化妆品经销商:我的公主
2016/08/05 全球购物
Foot Locker德国官方网站:美国运动服和鞋类零售商
2018/11/01 全球购物
美国排名第一的泳池用品直接来源:In The Swim
2019/09/23 全球购物
Brother加拿大官网:打印机、贴标机、缝纫机
2019/10/09 全球购物
通信工程毕业生自荐信
2013/11/01 职场文书
反腐倡廉演讲稿
2014/05/22 职场文书
征兵宣传标语
2014/06/20 职场文书
法人授权委托书范本
2014/09/17 职场文书
办公室班子四风问题对照检查材料
2014/10/04 职场文书
2014年挂职干部工作总结
2014/12/06 职场文书
五年级上册复习计划
2015/01/19 职场文书
城镇居民医疗保险工作总结
2015/08/10 职场文书