php输出缓存模式:三级缓存
脚本输出echo/print_r ===> php_buffer ===> tcp_buffer ===> 浏览器_buffer ===> 浏览器显示
1-浏览器_buffer(echo str_repeat("
", 200).'hello sjolzy.cn
';),这里是否是浏览器缓存的影响还是输出足够大爆到最大缓存了,还需要研究
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_系列函数
序号 |
名称 |
关闭 |
刷出 |
获得内容 |
清空 |
1 |
ob_clean |
× |
× |
× |
√ |
2 |
ob_end_clean |
√ |
× |
× |
√ |
3 |
ob_end_flush |
√ |
√ |
× |
√ |
4 |
ob_flush |
× |
√ |
× |
√ |
5 |
ob_get_clean<2,6> |
√ |
× |
√ |
√ |
6 |
ob_get_contents |
× |
× |
√ |
× |
7 |
ob_get_flush<3> |
√ |
√ |
√ |
√ |
备注:ob_end_flush()和ob_get_flush()的情况有点特别
--函数尾的_flush应该表示的是将缓冲区的内容放到tcp_buffer中
--如果当前缓冲区的外层没有缓冲区,情况确实如此,使用flush()后就可在浏览器输出
--但是当当前缓冲区外层还有缓冲区时,此_flush就不是放入tcp_buffer而是放入上级(不是最外层)缓冲区尾部
--切记!