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+MySQL5.0中文乱码解决方法
Nov 20 PHP
PHP Ajax中文乱码问题解决方法
Feb 27 PHP
关于php连接mssql:pdo odbc sql server
Jul 20 PHP
解析yahoo邮件用phpmailer发送的实例
Jun 24 PHP
php统计时间和内存使用情况示例分享
Mar 13 PHP
ThinkPHP Mobile使用方法简明教程
Jun 18 PHP
浅谈PHP中其他类型转化为Bool类型
Mar 28 PHP
微信小程序 消息推送php服务器验证实例详解
Mar 30 PHP
YII框架常用技巧总结
Apr 27 PHP
PHP命名空间定义与用法实例分析
Aug 14 PHP
Laravel5.1 框架表单验证操作实例详解
Jan 07 PHP
PHP 对接美团大众点评团购券(门票)的开发步骤
Apr 03 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
某大型网络公司应聘时的笔试题目附答案
2008/03/27 PHP
php 过滤器实现代码
2010/08/09 PHP
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
2013/05/07 PHP
php利用单例模式实现日志处理类库
2014/02/10 PHP
php + nginx项目中的权限详解
2017/05/23 PHP
php 调用百度sms来发送短信的实现示例
2018/11/02 PHP
TP3.2.3框架文件上传操作实例详解
2020/01/23 PHP
XHTML-Strict 内允许出现的标签
2006/12/11 Javascript
js 图片等比例缩放代码
2010/05/13 Javascript
最常用的12种设计模式小结
2011/08/09 Javascript
jquery Tab效果和动态加载的简单实例
2013/12/11 Javascript
js脚本分页代码分享(7种样式)
2015/08/19 Javascript
vue.js指令v-for使用及索引获取
2016/11/03 Javascript
微信小程序模板之分页滑动栏
2017/02/10 Javascript
Vue.js实现一个SPA登录页面的过程【推荐】
2017/04/29 Javascript
通过封装scroll.js 获取滚动条的值
2018/07/13 Javascript
微信小程序修改swiper默认指示器样式的实例代码
2018/07/18 Javascript
vue-cli webpack 引入swiper的操作方法
2018/09/15 Javascript
灵活使用console让js调试更简单的方法步骤
2019/04/23 Javascript
通过微信公众平台获取公众号文章的方法示例
2019/12/25 Javascript
Python字典底层实现原理详解
2019/12/18 Python
Django ValuesQuerySet转json方式
2020/03/16 Python
20行代码教你用python给证件照换底色的方法示例
2021/02/05 Python
CSS实现聊天气泡效果
2020/04/26 HTML / CSS
HTML5头部标签的一些常用信息小结
2016/10/23 HTML / CSS
家长会演讲稿范文
2014/01/10 职场文书
大学军训通讯稿
2014/01/13 职场文书
修理厂厂长岗位职责
2014/01/30 职场文书
小学生优秀评语大全
2014/04/22 职场文书
工程售后服务方案
2014/06/08 职场文书
门面房租房协议书
2014/08/20 职场文书
2016年感恩教师节活动总结
2016/04/01 职场文书
《合作意向书》怎么写?
2019/08/20 职场文书
vue实现同时设置多个倒计时
2021/05/20 Vue.js
PyTorch 如何自动计算梯度
2021/05/23 Python
python使用BeautifulSoup 解析HTML
2022/04/24 Python