php输出缓冲机制

来源:互联网 发布:linux zip命令解压 编辑:程序博客网 时间:2024/04/30 18:29

php输出缓存模式:三级缓存
脚本输出echo/print_r ===> php_buffer ===> tcp_buffer ===> 浏览器_buffer ===> 浏览器显示


1-浏览器_buffer除个别浏览器外,测试中发现一般无输出缓存

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而是放入上级(不是最外层)缓冲区尾部
--切记!


0 0
原创粉丝点击