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 Smarty 字符比较代码
Feb 27 PHP
php模拟post行为代码总结(POST方式不是绝对安全)
Feb 22 PHP
深入理解php的MySQL连接类
Jun 07 PHP
php获取域名的google收录示例
Mar 24 PHP
PHP计算加权平均数的方法
Jul 16 PHP
PHP读取配置文件类实例(可读取ini,yaml,xml等)
Jul 28 PHP
PHP简单实现断点续传下载的方法
Sep 25 PHP
浅谈PHP中其他类型转化为Bool类型
Mar 28 PHP
Yii开启片段缓存的方法
Mar 28 PHP
详解PHP中的序列化、反序列化操作
Mar 21 PHP
PHP编程快速实现数组去重的方法详解
Jul 22 PHP
基于swoole实现多人聊天室
Jun 14 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 地区分类排序算法
2013/07/01 PHP
ThinkPHP模版引擎之变量输出详解
2014/12/05 PHP
PHP如何实现Unicode和Utf-8编码相互转换
2015/07/29 PHP
PHP异常处理Exception类
2015/12/11 PHP
PHP二维数组矩形转置实例
2016/07/20 PHP
PHP实现的多维数组排序算法分析
2018/02/10 PHP
CSS中简写属性要注意TRouBLe的顺序问题(避免踩坑)
2021/03/09 HTML / CSS
Mozilla 表达式 __noSuchMethod__
2009/04/05 Javascript
为指定元素增加样式的js代码
2009/12/09 Javascript
Javascript根据指定下标或对象删除数组元素
2012/12/21 Javascript
js+css绘制颜色动态变化的圈中圈效果
2016/01/27 Javascript
微信小程序使用第三方库Immutable.js实例详解
2016/09/27 Javascript
JS中用三种方式实现导航菜单中的二级下拉菜单
2016/10/31 Javascript
angularjs获取到My97DatePicker选中的值方法
2018/10/02 Javascript
微信小程序 (地址选择1)--选取搜索地点并显示效果
2019/12/17 Javascript
JS前后端实现身份证号验证代码解析
2020/07/23 Javascript
Python多进程编程技术实例分析
2014/09/16 Python
使用Pyinstaller的最新踩坑实战记录
2017/11/08 Python
利用Python在一个文件的头部插入数据的实例
2018/05/02 Python
python使用原始套接字发送二层包(链路层帧)的方法
2019/07/22 Python
利用 Python ElementTree 生成 xml的实例
2020/03/06 Python
python中if及if-else如何使用
2020/06/02 Python
Python爬虫回测股票的实例讲解
2021/01/22 Python
科尔士百货公司官网:Kohl’s
2016/07/11 全球购物
巴西在线鞋店:Shoestock
2017/10/28 全球购物
捷克街头、运动和滑板一站式商店:BoardStar.cz
2019/10/06 全球购物
法国亚马逊官方网站:Amazon.fr
2020/12/19 全球购物
大四学年自我鉴定
2013/11/13 职场文书
企业内控岗位的职责
2014/02/07 职场文书
十八届三中全会报告学习材料
2014/02/17 职场文书
高中教师评语大全
2014/04/25 职场文书
医学专业毕业生推荐信
2014/07/12 职场文书
2014年前台个人工作总结
2014/11/14 职场文书
党小组考察意见
2015/06/02 职场文书
幼儿园迎新生欢迎词
2015/09/30 职场文书
mysql拆分字符串作为查询条件的示例代码
2022/07/07 MySQL