您的位置:首页 > 编程语言 > PHP开发

php输出缓冲机制

2015-12-09 15:06 561 查看
php输出缓存模式:三级缓存

脚本输出echo/print_r ===> php_buffer ===> tcp_buffer ===> 浏览器_buffer ===> 浏览器显示

1-浏览器_buffer(echo str_repeat("<div></div>", 200).'hello sjolzy.cn<br />';),这里是否是浏览器缓存的影响还是输出足够大爆到最大缓存了,还需要研究

2-php_buffer由7个ob_系列函数控制,作用附后

--php_buffer范围内可以开启多级缓冲区,此时ob_系列函数的控制类似堆栈的多级进出控制

--在官方文档中提到当开启多级缓冲的时候,ob_系列函数中某些影响顶层缓冲,有些影响当前缓冲

--我想这是翻译的问题,应该都表示当前缓冲

--在apache.php.ini中output_buffering = 4096,就相当于开启了第一个缓冲区

--当此缓冲区的具体数值似乎不起效,只有Off或者0才看到关闭第一层缓冲区的效果

3-tcp_buffer由2个函数控制,flush()手动,ob_implicit_flush()自动

--这两个函数是在tcp_buffer范围起效,所以对于php_buffer范围内的ob_系列函数来说是全局的

--由于有tcp_buffer缓冲的存在,又不知道这个缓存有多大,所以浏览器是否显示信息,绝对一定要受到这2个函数的影响

--无论php_buffer缓冲是否已满,是否已被ob_系列函数刷出

--在thinkphp3.2.0中2次使用ob_get_clean(),第一次无输出,第二次有输出,就是因为第一次显示关闭了ob_implicit_flush(0)

--而第二次的输出就是超过了tcp_buffer上限的输出

ob_系列函数
序号名称关闭刷出获得内容清空
1ob_clean×××
2ob_end_clean××
3ob_end_flush×
4ob_flush××
5ob_get_clean<2,6>×
6ob_get_contents×××
7ob_get_flush<3>
备注:ob_end_flush()和ob_get_flush()的情况有点特别

--函数尾的_flush应该表示的是将缓冲区的内容放到tcp_buffer中

--如果当前缓冲区的外层没有缓冲区,情况确实如此,使用flush()后就可在浏览器输出

--但是当当前缓冲区外层还有缓冲区时,此_flush就不是放入tcp_buffer而是放入上级(不是最外层)缓冲区尾部

--切记!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: