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的配置文件php.ini
Oct 09 PHP
PHP中使用gettext来支持多语言的方法
May 02 PHP
优化PHP程序的方法小结
Feb 23 PHP
解析:php调用MsSQL存储过程使用内置RETVAL获取过程中的return值
Jul 03 PHP
PHP5中GD库生成图形验证码(有汉字)
Jul 28 PHP
php如何解决无法上传大于8M的文件问题
Mar 10 PHP
php读取富文本的时p标签会出现红线是怎么回事
May 13 PHP
php防止站外远程提交表单的方法
Oct 20 PHP
ThinkPHP中自定义错误页面和提示页面实例
Nov 22 PHP
php实现用于删除整个目录的递归函数
Mar 16 PHP
php微信公众平台示例代码分析(二)
Dec 06 PHP
php中try catch捕获异常实例详解
Aug 06 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版(1)
2006/10/09 PHP
在PHP中读取和写入WORD文档的代码
2008/04/09 PHP
PHP 函数学习简单小结
2010/07/08 PHP
提高PHP编程效率的53个要点(经验小结)
2010/09/04 PHP
PHP常用设计模式之委托设计模式
2016/02/13 PHP
YII视图整合kindeditor扩展的方法
2016/07/13 PHP
php-app开发接口加密详解
2018/04/18 PHP
PHPUnit + Laravel单元测试常用技能
2019/11/06 PHP
JavaScript 申明函数的三种方法 每个函数就是一个对象(一)
2009/12/04 Javascript
利用onresize使得div可以随着屏幕大小而自适应的代码
2010/01/15 Javascript
input 输入框内的输入事件详细分析
2010/03/17 Javascript
10个实用的脚本代码工具
2010/05/04 Javascript
用jquery实现的模拟QQ邮箱里的收件人选取及其他效果(一)
2011/01/06 Javascript
7款吸引人眼球的jQuery/CSS3特效实例分享
2013/04/25 Javascript
PHP中使用微秒计算脚本执行时间例子
2014/11/19 Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
2014/12/29 Javascript
Javascript实现快速排序(Quicksort)的算法详解
2015/09/06 Javascript
JavaScript处理解析JSON数据过程详解
2015/09/11 Javascript
基于touch.js手势库+zepto.js插件开发图片查看器(滑动、缩放、双击缩放)
2016/11/17 Javascript
详解JS中定时器setInterval和setTImeout的this指向问题
2017/01/06 Javascript
js实现九宫格的随机颜色跳转
2017/02/19 Javascript
基于JavaScript实现活动倒计时效果
2017/04/20 Javascript
Angularjs为ng-click事件传递参数
2017/06/15 Javascript
手把手教你vue-cli单页到多页应用的方法
2018/05/31 Javascript
详解mpvue小程序中怎么引入iconfont字体图标
2018/10/01 Javascript
vue-quill-editor的使用及个性化定制操作
2020/08/04 Javascript
[39:18]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第二场 12.17
2020/12/19 DOTA
Django跨域资源共享问题(推荐)
2020/03/09 Python
PyCharm2019 安装和配置教程详解附激活码
2020/07/31 Python
python 使用建议与技巧分享(四)
2020/08/18 Python
关于python中remove的一些坑小结
2021/01/04 Python
CSS3实现时间轴效果
2016/07/11 HTML / CSS
生产部管理制度
2014/01/31 职场文书
2014年监理工作总结范文
2014/11/17 职场文书
火锅店的开业营销方案范本!
2019/07/05 职场文书
SQL Server中使用表变量和临时表
2022/05/20 SQL Server