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中的缓存机制解释相关推荐

  1. max点缓存烘焙帧_深入理解浏览器的缓存机制

    一.前言 缓存可以说是性能优化中简单高效的一种优化方式了.一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟,并且由于缓存文件可以重复利用,还可以减少带宽,降低网络负荷. 对于一个数据请求来说,可 ...

  2. (转载)彻底理解浏览器的缓存机制

    彻底理解浏览器的缓存机制 2018/04/16 概述 浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是根据HTTP报文的缓存标识进行的,所以在分析浏览器缓存机制之前,我们先使用图文简单介绍一下 ...

  3. 网络:浏览器静态资源缓存机制

    一.前言 为什么需要缓存? 缓存可以说是性能优化中简单高效的一种优化方式了.一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟,并且由于缓存文件可以重复利用,还可以减少带宽,降低网络负荷. 对于一 ...

  4. serversocket 返回浏览器图片_深入理解浏览器的缓存机制

       戳蓝字「前端技术优选」关注我们哦! 一.前言 缓存可以说是性能优化中简单高效的一种优化方式了.一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟,并且由于缓存文件可以重复利用,还可以减少带宽 ...

  5. 彻底吃透浏览器的缓存机制!

    作者 | 浪里行舟 责编 | 胡巍巍 前言 缓存可以说是性能优化中简单高效的一种优化方式了.一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟,并且由于缓存文件可以重复利用,还可以减少带宽,降低网 ...

  6. Http缓存机制与原理

    一 Http缓存基本概念 1.1 Http报文 在浏览器和服务器进行Http通信时发送的数据即为Http报文,其中分为两部分: header - 报文的首部或头部,其中保存着各类请求的属性字段,关于H ...

  7. HTTP缓存机制与原理详解

    1.1 - 缓存 缓存可以重用已获取的资源能够有效的提升网站与应用的性能. Web 缓存能够减少延迟与网络阻塞,进而减少显示某个资源所用的时间. 借助 HTTP 缓存,Web 站点变得更具有响应性. ...

  8. 彻底理解浏览器的缓存机制(http缓存机制)

    一.概述 浏览器的缓存机制也就是我们说的HTTP缓存机制,其机制是根据HTTP报文的缓存标识进行的,所以在分析浏览器缓存机制之前,我们先使用图文简单介绍一下HTTP报文,HTTP报文分为两种: 同步s ...

  9. 浏览器缓存机制介绍与缓存策略剖析

    缓存可以减少网络 IO 消耗,提高访问速度.浏览器缓存是一种操作简单.效果显著的前端性能优化手段.对于这个操作的必要性,Chrome 官方给出的解释似乎更有说服力一些: 通过网络获取内容既速度缓慢又开 ...

最新文章

  1. APUE(第七章)进程环境
  2. 面向非易失内存的MPI-IO接口优化
  3. CS0656 缺少编译器要求的成员“Microsoft.CSharp..........
  4. 计算机系统-电路设计04-全加器的内部电路实现
  5. micropython按键控制流水灯_【MicroPython】LAB01 - 流水灯
  6. HDU 1242 特殊化带结构体BFS
  7. 常用UCI数据集(已处理)
  8. VB中利用DrawText输出字符串且自动换行
  9. Unity app 如何打开商店
  10. 864. 二维数组区块计数
  11. cad计算机清空按键,cad delete键不能用怎么办-解决cad按delete键不能删除的方法 - 河东软件园...
  12. android 隐藏wifi密码,手机连接隐藏wifi怎么设置密码 手机如何添加隐藏wifi?-192路由网...
  13. Wing Pro 7中文版
  14. 如何将本地图片转换成链接
  15. 微信小程序之json-server环境搭建及简单操作
  16. c语言怎么让行末没有空格,新人提问:如何将输出时每行最后一个空格删除
  17. excel 设置表头表尾
  18. 三级数据库技术|重要知识点(一)
  19. java里getter和setter的作用和区别是什么?
  20. 用计算机说早上好,每日早上好的句子

热门文章

  1. JavaScript高级语法打包 - babel插件安装配置报错!Error: Cannot find module ‘@babel/preset-preset.env‘
  2. html背景图片横屏,CSS背景颜色 背景图片 居中 重复 固定样式background经验篇
  3. 如何在mysql查询结果集中得到记录行号_获取MySQL查询结果集中记录行号的方法...
  4. php脚本防上多进程同时执行,Jorker
  5. java中塑形_Java学习5——接口和多态
  6. CTF-杂项题-伪加密
  7. matlab实验函数编写与程序设计,matlab实验四函数编写与程序设计
  8. mysql rr 更新失败_RR 级别下 update 操作的是快照读还是当前读?
  9. linux搭建mcpe服务器_Ubuntu Linux下搭建Minecraft我的世界服务器
  10. php数组能不能静态,php 为什么常量可以用数组定义 静态变量却不能