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中路径问题的解决方案
Oct 09 PHP
apache rewrite_module模块使用教程
Jan 10 PHP
ajax+php打造进度条 readyState各状态
Mar 20 PHP
理解和运用PHP中的多态性[译]
Aug 02 PHP
基于PHP常用函数的用法详解
May 10 PHP
PHP5函数小全(分享)
Jun 06 PHP
destoon找回管理员密码的方法
Jun 21 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(一)
Jun 23 PHP
CMS中PHP判断系统是否已经安装的方法示例
Jul 26 PHP
ThinkPHP中关联查询实例
Dec 02 PHP
phpStudy 2016 使用教程详解(支持PHP7)
Oct 18 PHP
PHP中散列密码的安全性分析
Jul 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和ACCESS写聊天室(八)
2006/10/09 PHP
如何隐藏你的.php文件
2007/01/04 PHP
php多用户读写文件冲突的解决办法
2013/11/06 PHP
YII使用url组件美化管理的方法
2015/12/28 PHP
JavaScript小技巧 2.5 则
2010/09/12 Javascript
ASP.NET jQuery 实例18 通过使用jQuery validation插件校验DropDownList
2012/02/03 Javascript
javascript学习笔记(十六) 系统对话框(alert、confirm、prompt)
2012/06/20 Javascript
jquery中使用$(#form).submit()重写提交表单无效原因分析及解决
2013/03/25 Javascript
js判断FCKeditor内容是否为空的两种形式
2013/05/14 Javascript
js获取或设置当前窗口url参数的小例子
2013/10/14 Javascript
javascript 表格内容排序 简单操作示例代码
2014/01/03 Javascript
JavaScript实现斗地主游戏的思路
2016/02/29 Javascript
详解前端自动化工具gulp自动添加版本号
2016/12/20 Javascript
jquery.uploadView 实现图片预览上传功能
2017/08/10 jQuery
JavaScript享元模式原理与用法实例详解
2020/03/09 Javascript
[38:42]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第二场 11.05
2020/11/05 DOTA
Python-嵌套列表list的全面解析
2016/06/08 Python
Python网络爬虫出现乱码问题的解决方法
2017/01/05 Python
Python面向对象程序设计类的多态用法详解
2019/04/12 Python
在Python中合并字典模块ChainMap的隐藏坑【推荐】
2019/06/27 Python
使用 python pyautogui实现鼠标键盘控制功能
2019/08/04 Python
Python数据结构dict常用操作代码实例
2020/03/12 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
2020/04/24 Python
Python机器学习工具scikit-learn的使用笔记
2021/01/28 Python
10 套华丽的CSS3 按钮小结
2012/10/03 HTML / CSS
法国房车租赁网站:Yescapa
2019/08/26 全球购物
澳洲CFL商城:CHEMIST FOR LESS(中文)
2021/02/28 全球购物
关键字throw与throws的用法差异
2016/11/22 面试题
个人自我鉴定写法
2013/11/30 职场文书
初中高效课堂实施方案
2014/02/26 职场文书
宣传部部长竞选演讲稿
2014/04/26 职场文书
大三学习计划书范文
2014/05/02 职场文书
环境日宣传活动总结
2014/07/09 职场文书
单位实习介绍信
2015/05/05 职场文书
创业计划书之情侣餐厅
2019/09/29 职场文书
Winsows11性能如何? win11性能测评多核竟比Win10差了10%
2021/11/21 数码科技