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 相关文章推荐
5.PHP的其他功能
Oct 09 PHP
多数据表共用一个页的新闻发布
Oct 09 PHP
如何开发一个虚拟域名系统
Oct 09 PHP
第七节--类的静态成员
Nov 16 PHP
php读取javascript设置的cookies的代码
Apr 12 PHP
php strnatcmp()函数的用法总结
Nov 27 PHP
php中switch语句用法详解
Aug 17 PHP
PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例
Aug 17 PHP
Smarty变量用法详解
May 11 PHP
无需数据库在线投票调查php代码
Jul 20 PHP
详解PHP发送邮件知识点
May 06 PHP
Laravel框架模型的创建及模型对数据操作示例
May 07 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下清空字符串中的HTML标签的代码
2010/09/06 PHP
PHP实现微信商户支付企业付款到零钱功能
2018/09/30 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
2019/10/16 PHP
JSON.parse 解析字符串出错的解决方法
2010/07/08 Javascript
jquery全选checkBox功能实现代码(取消全选功能)
2013/12/10 Javascript
用js控制组织结构图可以任意拖拽到指定位置
2014/01/17 Javascript
javascript移动设备Web开发中对touch事件的封装实例
2014/06/05 Javascript
JQuery自动触发事件的方法
2015/06/13 Javascript
详解jQuery中的元素的属性和相关操作
2015/08/14 Javascript
学JavaScript七大注意事项【必看】
2016/05/04 Javascript
Bootstrap3制作搜索框样式的方法
2016/07/11 Javascript
JavaScript、C# URL编码、解码总结
2017/01/21 Javascript
JavaScript实现简单评论功能
2017/08/17 Javascript
Angular5.1新功能分享
2017/12/21 Javascript
vue移动端UI框架实现QQ侧边菜单组件
2018/03/09 Javascript
bootstrapTable+ajax加载数据 refresh更新数据
2018/08/31 Javascript
30分钟精通React今年最劲爆的新特性——React Hooks
2019/03/11 Javascript
Django模板继承 extend标签实例代码详解
2019/05/16 Javascript
[54:54]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python实现竖排打印传单手机号码易撕条
2015/03/16 Python
利用Python的Twisted框架实现webshell密码扫描器的教程
2015/04/16 Python
Python 数据可视化pyecharts的使用详解
2019/06/26 Python
手把手教你pycharm专业版安装破解教程(linux版)
2019/09/26 Python
Jupyter Notebook的连接密码 token查询方式
2020/04/21 Python
Python切片列表字符串如何实现切换
2020/08/06 Python
详解pycharm2020.1.1专业版安装指南(推荐)
2020/08/07 Python
CSS3色彩模式有哪些?CSS3 HSL色彩模式的定义
2016/04/26 HTML / CSS
怎样比较两个类型为String的字符串
2016/08/17 面试题
运动会通讯稿50字
2014/01/30 职场文书
《小池塘》教学反思
2014/02/28 职场文书
党的群众路线对照检查材料思想汇报
2014/09/25 职场文书
邀请函的格式
2015/01/30 职场文书
2015年安全生产月工作总结
2015/07/27 职场文书
创业项目(超低成本创业项目)
2019/08/16 职场文书
面试中老生常谈的MySQL问答集锦夯实基础
2022/03/13 MySQL
MySQL中LAG()函数和LEAD()函数的使用
2022/08/14 MySQL