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 5.0对象模型深度探索之类的静态成员
Mar 27 PHP
PHP 源代码压缩小工具
Dec 22 PHP
浅析PKI加密解密 OpenSSL
Jul 01 PHP
PHP加Nginx实现动态裁剪图片方案
Mar 10 PHP
Linux中用PHP判断程序运行状态的2个方法
May 04 PHP
destoon安装出现Internal Server Error的解决方法
Jun 21 PHP
php微信开发之批量生成带参数的二维码
Jun 26 PHP
php求数组全排列,元素所有组合的方法总结
Mar 14 PHP
yii 2.0中表单小部件的使用方法示例
May 23 PHP
PHP文字转图片功能原理与实现方法分析
Aug 31 PHP
基于Laravel实现的用户动态模块开发
Sep 21 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
Nov 10 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中文验证码实现方法
2015/06/18 PHP
PHP使用mkdir创建多级目录的方法
2015/12/22 PHP
php 指定范围内多个随机数代码实例
2016/07/18 PHP
PHP实现Google plus的好友拖拽分组效果
2016/10/21 PHP
php封装的数据库函数与用法示例【参考thinkPHP】
2016/11/08 PHP
JavaScript几种形式的树结构菜单
2010/05/10 Javascript
jquery根据锚点offset值实现动画切换
2014/09/11 Javascript
JavaScript使用Max函数返回两个数字中较大数的方法
2015/04/06 Javascript
jQuery配合coin-slider插件制作幻灯片效果的流程解析
2016/05/13 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
2016/05/31 Javascript
利用jsonp跨域调用百度js实现搜索框智能提示
2016/08/24 Javascript
BootstrapTable加载按钮功能实例代码详解
2017/09/22 Javascript
解决Angular4项目部署到服务器上刷新404的问题
2018/08/31 Javascript
代码实例ajax实现点击加载更多数据图片
2018/10/12 Javascript
python实现读取命令行参数的方法
2015/05/22 Python
python2.7实现FTP文件下载功能
2018/04/15 Python
解决python3读取Python2存储的pickle文件问题
2018/10/25 Python
Pycharm配置远程调试的方法步骤
2018/12/17 Python
Python3 串口接收与发送16进制数据包的实例
2019/06/12 Python
pandas DataFrame 交集并集补集的实现
2019/06/24 Python
浅析pandas 数据结构中的DataFrame
2019/10/12 Python
python3 assert 断言的使用详解 (区别于python2)
2019/11/27 Python
python中提高pip install速度
2020/02/14 Python
pyMySQL SQL语句传参问题,单个参数或多个参数说明
2020/06/06 Python
python thrift 实现 单端口多服务的过程
2020/06/08 Python
2021年的Python 时间轴和即将推出的功能详解
2020/07/27 Python
浅谈Python __init__.py的作用
2020/10/28 Python
解决pytorch 数据类型报错的问题
2021/03/03 Python
实例讲解CSS3中的border-radius属性
2015/08/18 HTML / CSS
美国儿童服装、家具和玩具精品店:Maisonette
2019/11/24 全球购物
业务员岗位职责范本
2013/12/15 职场文书
优秀的2014年两会精神解读
2014/03/17 职场文书
机械设计专业大学生职业生涯规划书范文
2014/09/13 职场文书
早读课迟到检讨书
2014/09/25 职场文书
销售经理助理岗位职责
2015/04/13 职场文书
Python pyecharts案例超市4年数据可视化分析
2022/08/14 Python