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_系列函数
备注:ob_end_flush()和ob_get_flush()的情况有点特别
--函数尾的_flush应该表示的是将缓冲区的内容放到tcp_buffer中
--如果当前缓冲区的外层没有缓冲区,情况确实如此,使用flush()后就可在浏览器输出
--但是当当前缓冲区外层还有缓冲区时,此_flush就不是放入tcp_buffer而是放入上级(不是最外层)缓冲区尾部
--切记!
脚本输出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上限的输出
序号 | 名称 | 关闭 | 刷出 | 获得内容 | 清空 |
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> | √ | √ | √ | √ |
--函数尾的_flush应该表示的是将缓冲区的内容放到tcp_buffer中
--如果当前缓冲区的外层没有缓冲区,情况确实如此,使用flush()后就可在浏览器输出
--但是当当前缓冲区外层还有缓冲区时,此_flush就不是放入tcp_buffer而是放入上级(不是最外层)缓冲区尾部
--切记!
相关文章推荐
- 结合sae,thinkphp完成头像的更改与上传
- thinkphp 3.2 =》0623-7 调用数据库
- thinkphp整合ueditor上传功能
- php自动加载机制
- php7 兼容 mysql
- ubuntu 14.04上源码编译安装php7
- WindowManager.LayoutParams
- thinkphp 关于iis上面中文参数乱码问题
- phpstorm激活
- PHP编程效率的20个要点
- Cygwin下安装SFTP Server
- windows ftp自动上传bat脚本
- PHP php面向对象的入门
- PHP正则表达式
- thinkPHP使用post方式查询时分页失效的解决方法
- 【PHP面向对象(OOP)编程入门教程】4.如何抽象出一个类?
- phpstorm配置Xdebug进行调试PHP教程
- Ubuntu下,ftp启用pam之后报 530 Login incorrect的解决办法
- PHP传值和传引用、传地址的区别
- 学习php设计模式 php实现备忘录模式(Memento)