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