php输出缓冲机制

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


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值