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访问MYSQL数据库封装类(附函数说明)
Dec 04 PHP
Eclipse中php插件安装及Xdebug配置的使用详解
Apr 25 PHP
解析php利用正则表达式解决采集内容排版的问题
Jun 20 PHP
使用PHP Socket写的POP3类
Oct 30 PHP
PHP自带函数给数字或字符串自动补齐位数
Jul 29 PHP
PHP return语句的另一个作用
Jul 30 PHP
php中memcache 基本操作实例
May 17 PHP
CI(CodeIgniter)模型用法实例分析
Jan 20 PHP
PHP创建word文档的方法(平台无关)
Mar 29 PHP
php+MySql实现登录系统与输出浏览者信息功能
Jul 01 PHP
PHP编写文件多服务器同步程序
Jul 02 PHP
PHP中关于php.ini参数优化详解
Feb 28 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二分法在IP地址查询中的应用
2008/08/12 PHP
PHP函数addslashes和mysql_real_escape_string的区别
2014/04/22 PHP
PHP中使用asort进行中文排序失效的问题处理
2014/08/18 PHP
CI框架验证码CAPTCHA辅助函数用法实例
2014/11/05 PHP
PHP比你想象的好得多
2014/11/27 PHP
JQuery 常用操作代码
2010/03/14 Javascript
jquery 获取标签名(tagName)示例代码
2013/07/11 Javascript
jquery fancybox ie6不显示关闭按钮的解决办法
2013/12/25 Javascript
浅谈JavaScript中定义变量时有无var声明的区别
2014/08/18 Javascript
让JavaScript和其它资源并发下载的方法
2014/10/16 Javascript
浅谈javascript 函数属性和方法
2015/01/21 Javascript
JavaScript中的分号插入机制详细介绍
2015/02/11 Javascript
jQuery实现菜单感应鼠标滑动动画效果的方法
2015/02/28 Javascript
jQuery实现购物车数字加减效果
2015/03/14 Javascript
Jquery检验手机号是否符合规则并根据手机号检测结果将提交按钮设为不同状态
2015/11/26 Javascript
使用Jasmine和Karma对AngularJS页面程序进行测试
2016/03/05 Javascript
使用jQuery实现Web页面换肤功能的要点解析
2016/05/12 Javascript
AngularJS下对数组的对比分析
2016/08/24 Javascript
node中的密码安全(加密)
2018/09/17 Javascript
[58:18]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Mineski
2018/03/30 DOTA
Python strip lstrip rstrip使用方法
2008/09/06 Python
python 算法 排序实现快速排序
2012/06/05 Python
python集合类型用法分析
2015/04/08 Python
Python线程池模块ThreadPoolExecutor用法分析
2018/12/28 Python
python 实现多线程下载m3u8格式视频并使用fmmpeg合并
2019/11/15 Python
TensorFlow Autodiff自动微分详解
2020/07/06 Python
澳大利亚领先的宠物用品商店:VetSupply
2017/09/08 全球购物
Skyscanner英国:苏格兰的全球三大领先航班搜索服务之一
2017/11/09 全球购物
马来西亚网上花店:FlowerAdvisor马来西亚
2020/01/03 全球购物
网络工程与软件技术毕业生自荐信
2013/09/24 职场文书
即兴演讲稿
2014/01/04 职场文书
《二泉映月》教学反思
2014/04/15 职场文书
经贸日语专业自荐信
2014/09/02 职场文书
招标授权委托书样本
2014/09/23 职场文书
入党宣誓大会后的感想
2015/08/10 职场文书
修改MySQL的数据库引擎为INNODB的方法
2021/05/26 MySQL