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 相关文章推荐
Discuz 6.0+ 批量注册用户名
Sep 13 PHP
php实现的双向队列类实例
Sep 24 PHP
PHP+Mysql+jQuery中国地图区域数据统计实例讲解
Oct 10 PHP
关于php中的json_encode()和json_decode()函数的一些说明
Nov 20 PHP
php获取指定数量随机字符串的方法
Feb 06 PHP
PHP使用file_get_contents发送http请求功能简单示例
Apr 29 PHP
PHP预定义超全局数组变量小结
Aug 20 PHP
PHP将英文数字转换为阿拉伯数字实例讲解
Jan 28 PHP
Laravel 已登陆用户再次查看登陆页面的自动跳转设置方法
Sep 30 PHP
tp5框架使用cookie加密算法实现登录功能示例
Feb 10 PHP
PHP ob缓存以及ob函数原理实例解析
Nov 13 PHP
PHP内存溢出优化代码详解
Feb 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实现的简单日志写入函数
2015/03/31 PHP
PHP实现获取文件后缀名的几种常用方法
2015/08/08 PHP
php实现批量上传数据到数据库(.csv格式)的案例
2017/06/18 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
为Plesk PHP7启用Oracle OCI8扩展方法总结
2019/03/29 PHP
javascript中用星号表示预录入内容的实现代码
2011/01/08 Javascript
浅析JavaScript中的类型和对象
2013/11/29 Javascript
引入autocomplete组件时JS报未结束字符串常量错误
2014/03/19 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
2015/03/13 Javascript
js实现字符串转日期格式的方法
2015/05/20 Javascript
jQuery实现的仿百度分页足迹效果代码
2015/10/30 Javascript
浅谈js里面的InttoStr和StrtoInt
2016/06/14 Javascript
javascript时间戳和日期字符串相互转换代码(超简单)
2016/06/22 Javascript
jQuery获取select选中的option的value值实现方法
2016/08/29 Javascript
js仿iphone秒表功能 计算平均数
2017/01/11 Javascript
Echart折线图手柄触发事件示例详解
2018/12/16 Javascript
详解key在Vue列表渲染时究竟起到了什么作用
2019/04/20 Javascript
微信小程序实现张图片合成为一张并下载
2019/07/16 Javascript
vue cli3 调用百度翻译API翻译页面的实现示例
2019/09/13 Javascript
Vue-Ant Design Vue-普通及自定义校验实例
2020/10/24 Javascript
python中的多重继承实例讲解
2014/09/28 Python
用Python的Tornado框架结合memcached页面改善博客性能
2015/04/24 Python
mac下pycharm设置python版本的图文教程
2018/06/13 Python
python 函数的缺省参数使用注意事项分析
2019/09/17 Python
Python 脚本拉取 Docker 镜像问题
2019/11/10 Python
如何基于Python获取图片的物理尺寸
2019/11/25 Python
HTML5实现移动端点击翻牌功能
2020/10/23 HTML / CSS
工作的心得体会
2013/12/31 职场文书
个人简历中的自我评价怎么写
2014/01/26 职场文书
党风廉政建设责任书
2014/04/14 职场文书
党员承诺书怎么写
2014/05/20 职场文书
档案接收函格式
2015/01/30 职场文书
法定代表人免职证明
2015/06/24 职场文书
react中props 的使用及进行限制的方法
2021/04/28 Javascript
Java时间工具类Date的常用处理方法
2022/05/25 Java/Android
Redis过期数据是否会被立马删除
2022/07/23 Redis