php中的缓,php中的缓存机制解释
php缓存的理解,先列出ob系列函数的作用:
ob_start('func') 开启php缓存,回调函数是对缓存内数据的处理函数
ob_gzhandler 作为 ob_start 的回调函数,对数据进行gz压缩
ob_implicit_flush(true/false) 打开或关闭apache缓存,打开apache缓存将直接将数据输出给用户浏览器,不必用buffer函数手动输出
flush 将apache缓存区的数据发送出去TCP到用户浏览器
ob_get_contents 获取缓存内容
ob_get_length 获取缓存内容长度
ob_get_level 返回缓存级别(每个ob_start将开启一个重0编号的缓存区)
array ob_get_status() 返回当前缓存机制的一些信息
ob_list_handlers
void ob_flush 送出当前缓存区内容到上一缓存区并保留当前缓存区
void ob_end_flush 送出当前缓存区内容到上一缓存区销毁(关闭)当前缓存区
string ob_get_flush 送出当前缓存区内容到上一缓存区销毁(关闭)当前缓存区 并返回缓冲区内容
void ob_clean 清空当前缓冲区内容
void ob_end_clean 清空当前缓冲区内容并销毁(关闭)当前缓存区
string ob_get_clean 清空当前缓冲区内容并销毁(关闭)当前缓存区 并返回当前缓存区内容
缓存的整个机制如下图所示:
ob系列函数针对的都是 php bufer这块
在php buffer中,每一个ob_start都会在php buffer中开启一块内存空间,并且支持多级嵌套,嵌套关系如图
不嵌套的话 "php最终输出缓存区"就是level0 ,嵌套级别的操作都是对上级缓存空间进行的操作 (level0 的上级缓存是Apache Buffer)
flush 函数是对Apache Buffer进行的操作,刷新Apache Buffer 发送数据走TCP到用户浏览器
PHP Buffer :
在php.ini 中的选项 output_buffer 是控制php buffer的,当output_buffer = On 或者 output_buffer = number(num>0) 默认开启缓存 ob_start不能控制php buffer
当 output_buffer=0 或者 output_buffer=Off 就是关闭缓存 在脚本中需要 通过 ob_start 函数开启
output_buffer项不能通过 ini_set进行修改
Apache Buffer:
在php.ini中的选项implicit_flush= On/Off 开启的话,Apache Buffer中的数据不会缓存而是直接发送出去
ob_implicit_flush(true/ false) 可以对这个选项进行设置
开启Apache Buffer缓存后要想送出缓存中的数据需要用到函数 flush
很多时候 ob_flush flush 要结合使用:
ob_flush PHP Buffer->Apache Buffer
flush Apache Buffer->Browser
ob_flush ob_end_flush ob_get_flush 都有送出缓存内容的操作,这时的送出缓存都是送出到上一级别的缓存区域 最后一并输出给Apache Buffer
关于PHP Buffer中的多级缓存:
每个ob_start 函数都会在PHP Buffer中开启一个缓存区域,php会将这些区域进行编号(从0开始),可以通过 ob_get_level函数获取编号
缓存嵌套的整个操作是将整个缓存进行合并最后一并发送给Apache Buffer
ob_flush函数是将当前编号内的内容送到上一编号并将php buffer中的内容发送到Apache Buffer
例子1:
ob_start();
echo "buffer1
";
ob_start();
echo "buffer2
";
ob_start();
echo "buffer3
";
ob_end_flush();
echo ob_get_level().'
';
ob_end_flush();
echo ob_get_level().'
';
ob_end_flush();
echo ob_get_level().'
';
输出内容:
buffer1
buffer2
buffer3
2
1
0
从返回的level值可看出,整个嵌套级别是从后往前的
例子二:
ob_start();
echo "buffer1
";
ob_start();
echo "buffer2
";
ob_start();
echo "buffer3
";
ob_end_clean();
ob_end_flush();
ob_end_flush();
结果:
buffer1
buffer2
不出所料,先将 2 级别缓存的内容clean掉,1 ,0 级别的内容正常输出
例子三:
ob_start();
echo "buffer1
";
ob_start();
echo "buffer2
";
ob_start();
echo "buffer3
";
ob_end_flush();
ob_end_clean();
ob_end_flush();
结果:
buffer1
从上面的例子可以总结下php缓存机制中嵌套中 整合输出的过程如下
ob_start(); echo 'buffer1' 缓存如下 0:"buffer1"
ob_start(); echo 'buffer2' 缓存如下 1:"buffer2"---->0:"buffer1"
ob_start(); echo 'buffer3' 缓存如下 2:"buffer3"---->1:"buffer2"---->0:"buffer1"
如例子一中
第一次 ob_end_flush 缓存结构 1:"buffer2buffer3"---->0:"buffer1"
第二次 ob_end_flush 缓存结构 0:"buffer1buffer2buffer3"
第三次 ob_end_flush 缓存结构 发送内容到Apache Buffer
结果:buffer1buffer2buffer3
如例子二中
ob_end_clean 缓存结构 1:"buffer2"---->0:"buffer1"
ob_end_flush 缓存结构 0:"buffer1buffer2"
ob_end_flush 缓存结构 发送内容到Apache Buffer
结果:buffer1buffer2
如例子三中
ob_end_flush 缓存结构 1:"buffer2buffer3"---->0:"buffer1"
ob_end_clean 缓存结构 0:"buffer1"
ob_end_flush 缓存结构 发送内容到Apache Buffer
结果:buffer1
以上清楚的解释了php中的缓存机制
理解了整个机制,函数的使用就简单了 Good Luck
php中的缓,php中的缓存机制解释相关推荐
- max点缓存烘焙帧_深入理解浏览器的缓存机制
一.前言 缓存可以说是性能优化中简单高效的一种优化方式了.一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟,并且由于缓存文件可以重复利用,还可以减少带宽,降低网络负荷. 对于一个数据请求来说,可 ...
- (转载)彻底理解浏览器的缓存机制
彻底理解浏览器的缓存机制 2018/04/16 概述 浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是根据HTTP报文的缓存标识进行的,所以在分析浏览器缓存机制之前,我们先使用图文简单介绍一下 ...
- 网络:浏览器静态资源缓存机制
一.前言 为什么需要缓存? 缓存可以说是性能优化中简单高效的一种优化方式了.一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟,并且由于缓存文件可以重复利用,还可以减少带宽,降低网络负荷. 对于一 ...
- serversocket 返回浏览器图片_深入理解浏览器的缓存机制
戳蓝字「前端技术优选」关注我们哦! 一.前言 缓存可以说是性能优化中简单高效的一种优化方式了.一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟,并且由于缓存文件可以重复利用,还可以减少带宽 ...
- 彻底吃透浏览器的缓存机制!
作者 | 浪里行舟 责编 | 胡巍巍 前言 缓存可以说是性能优化中简单高效的一种优化方式了.一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟,并且由于缓存文件可以重复利用,还可以减少带宽,降低网 ...
- Http缓存机制与原理
一 Http缓存基本概念 1.1 Http报文 在浏览器和服务器进行Http通信时发送的数据即为Http报文,其中分为两部分: header - 报文的首部或头部,其中保存着各类请求的属性字段,关于H ...
- HTTP缓存机制与原理详解
1.1 - 缓存 缓存可以重用已获取的资源能够有效的提升网站与应用的性能. Web 缓存能够减少延迟与网络阻塞,进而减少显示某个资源所用的时间. 借助 HTTP 缓存,Web 站点变得更具有响应性. ...
- 彻底理解浏览器的缓存机制(http缓存机制)
一.概述 浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是根据HTTP报文的缓存标识进行的,所以在分析浏览器缓存机制之前,我们先使用图文简单介绍一下HTTP报文,HTTP报文分为两种: 同步s ...
- 浏览器缓存机制介绍与缓存策略剖析
缓存可以减少网络 IO 消耗,提高访问速度.浏览器缓存是一种操作简单.效果显著的前端性能优化手段.对于这个操作的必要性,Chrome 官方给出的解释似乎更有说服力一些: 通过网络获取内容既速度缓慢又开 ...
最新文章
- APUE(第七章)进程环境
- 面向非易失内存的MPI-IO接口优化
- CS0656	缺少编译器要求的成员“Microsoft.CSharp..........
- 计算机系统-电路设计04-全加器的内部电路实现
- micropython按键控制流水灯_【MicroPython】LAB01 - 流水灯
- HDU 1242 特殊化带结构体BFS
- 常用UCI数据集(已处理)
- VB中利用DrawText输出字符串且自动换行
- Unity app 如何打开商店
- 864. 二维数组区块计数
- cad计算机清空按键,cad delete键不能用怎么办-解决cad按delete键不能删除的方法 - 河东软件园...
- android 隐藏wifi密码,手机连接隐藏wifi怎么设置密码 手机如何添加隐藏wifi?-192路由网...
- Wing Pro 7中文版
- 如何将本地图片转换成链接
- 微信小程序之json-server环境搭建及简单操作
- c语言怎么让行末没有空格,新人提问:如何将输出时每行最后一个空格删除
- excel 设置表头表尾
- 三级数据库技术|重要知识点(一)
- java里getter和setter的作用和区别是什么?
- 用计算机说早上好,每日早上好的句子
热门文章
- JavaScript高级语法打包 - babel插件安装配置报错!Error: Cannot find module ‘@babel/preset-preset.env‘
- html背景图片横屏,CSS背景颜色 背景图片 居中 重复 固定样式background经验篇
- 如何在mysql查询结果集中得到记录行号_获取MySQL查询结果集中记录行号的方法...
- php脚本防上多进程同时执行,Jorker
- java中塑形_Java学习5——接口和多态
- CTF-杂项题-伪加密
- matlab实验函数编写与程序设计,matlab实验四函数编写与程序设计
- mysql rr 更新失败_RR 级别下 update 操作的是快照读还是当前读?
- linux搭建mcpe服务器_Ubuntu Linux下搭建Minecraft我的世界服务器
- php数组能不能静态,php 为什么常量可以用数组定义 静态变量却不能