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数据代码
Jun 05 PHP
一个php Mysql类 可以参考学习熟悉下
Jun 21 PHP
用PHP为SHOPEX增加日志功能代码
Jul 02 PHP
PHP实现邮件群发的源码
Jun 18 PHP
php实现可用于mysql,mssql,pg数据库操作类
Dec 13 PHP
PHP PDO fetch 模式各种参数的输出结果一览
Jan 07 PHP
PHP实现的蚂蚁爬杆路径算法代码
Dec 03 PHP
PHP下SSL加密解密、验证、签名方法(很简单)
Jun 28 PHP
深入解析PHP的Laravel框架中的event事件操作
Mar 21 PHP
PHP云打印类完整示例
Oct 15 PHP
laravel migrate初学常见错误的解决方法
Oct 11 PHP
Laravel中正确地返回HTTP状态码方法示例
Sep 10 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 在windows下配置虚拟目录的方法介绍
2013/06/26 PHP
64位windows系统下安装Memcache缓存
2015/12/06 PHP
JS提交并解析后台返回的XML的代码
2008/11/03 Javascript
在JavaScript中监听IME键盘输入事件
2011/05/29 Javascript
为JavaScript类型增加方法的实现代码(增加功能)
2011/12/29 Javascript
Javascript模块化编程(一)AMD规范(规范使用模块)
2013/01/17 Javascript
JS获取月份最后天数、最大天数与某日周数的方法
2015/12/08 Javascript
jQuery ajax应用总结
2016/06/02 Javascript
ajax +NodeJS 实现图片上传实例
2017/06/06 NodeJs
BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
2017/08/07 Javascript
微信小程序实现YDUI的ScrollNav组件
2018/02/02 Javascript
jQuery 筛选器简单操作示例
2019/10/02 jQuery
nest.js 使用express需要提供多个静态目录的操作方法
2019/10/24 Javascript
Js逆向实现滑动验证码图片还原的示例代码
2020/03/10 Javascript
[03:24][TI9纪实] Dota奶爸
2019/08/22 DOTA
Python中的CURL PycURL使用例子
2014/06/01 Python
利用一个简单的例子窥探CPython内核的运行机制
2015/03/30 Python
Python队列的定义与使用方法示例
2017/06/24 Python
Python调用C# Com dll组件实战教程
2017/10/12 Python
matplotlib绘制动画代码示例
2018/01/02 Python
详解python中递归函数
2019/04/16 Python
windows下安装Python虚拟环境virtualenvwrapper-win
2019/06/14 Python
python程序 创建多线程过程详解
2019/09/23 Python
pandas 强制类型转换 df.astype实例
2020/04/09 Python
苏格兰销售女装、男装和童装的连锁店:M&Co
2018/03/16 全球购物
英国历史最悠久的DJ设备供应商:DJ Finance、DJ Warehouse、The DJ Shop
2019/09/04 全球购物
美国轻奢时尚购物网站:REVOLVE(支持中文)
2020/07/18 全球购物
留学自荐信的技巧
2013/10/17 职场文书
大专毕业生自我鉴定
2013/11/21 职场文书
早读迟到检讨书
2014/01/24 职场文书
酒店管理专业自荐信
2014/05/23 职场文书
运动会入场口号
2014/06/07 职场文书
岗位职责说明书模板
2014/07/30 职场文书
小学生国庆演讲稿
2014/09/05 职场文书
详细了解java监听器和过滤器
2021/07/09 Java/Android
前端vue+express实现文件的上传下载示例
2022/02/18 Vue.js