您当前的位置: 站长圈 > 技术文章 > 后端教程 > php中的ob缓存机制解释

php中的ob缓存机制解释

来源:www.ithhc.cn 作者:网页狗 点击: 0

 

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    清空当前缓冲区内容并销毁(关闭)当前缓存区 并返回当前缓存区内容

 

20140929154526690.png

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

 

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().'
';