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<br>";
ob_start();
echo "buffer2<br>";
ob_start();
echo "buffer3<br>";

ob_end_flush();
echo ob_get_level().'<br>';
ob_end_flush();
echo ob_get_level().'<br>';
ob_end_flush();
echo ob_get_level().'<br>';

输出内容:

buffer1
buffer2
buffer3
2
1
0

从返回的level值可看出,整个嵌套级别是从后往前的


例子二:

ob_start();
echo "buffer1<br>";
ob_start();
echo "buffer2<br>";
ob_start();
echo "buffer3<br>";

ob_end_clean();
ob_end_flush();
ob_end_flush();

结果:

buffer1
buffer2

不出所料,先将 2 级别缓存的内容clean掉,1 ,0 级别的内容正常输出


例子三:

ob_start();
echo "buffer1<br>";
ob_start();
echo "buffer2<br>";
ob_start();
echo "buffer3<br>";

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吐舌头


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值