php缓冲区
我理解的要点:
1、所有缓冲区控制是在一个PHP执行进程中发生的。如:你打开n个demo.php,他们之间开启和关闭缓冲是互不影响的。
2、output_buffering在程序中用ini_set是不能生效的。
3、所有缓冲区数据,如果没有手工flush刷出,则在程序结束会被解释器刷出。
4、关于嵌套级别:当顺序开启多个ob_start()时,会相应开启多个缓冲区。可以理解成队列,队伍成员是ob_start()开启的缓冲区块,而ob_get_level()可理解成当前队伍最末尾的缓冲块的序列号。
5、每次echo,print输出的内容都是针对队尾的缓冲区块进行的。
6、每次ob[end][flush|clean]函数也都是针对队尾缓冲区块进行的。
7、每次执行flush刷出,都是由位于队尾缓冲区块向上一级缓冲区块刷出,且区块里的内容不是替换,而是叠加。
看例子
echo ob_get_level(),一般情况下输出:
1
因为php.ini默认设置了output_buffering = 4096,这代表着不管程序里面怎么写,php已经设置了一个缓冲区。
该缓冲区可以手工关闭:
ob_end_clean();
echo ob_get_level();
这时程序输出:
0
如果再加一条ob_end_clean()就会看到提示:
Notice: ob_end_clean(): failed to delete buffer. No buffer to delete
更改php.ini,修改配置output_buffering = 0,再看echo ob_get_level(),输出:
0
将配置修改成output_buffering = 4096,恢复初始状态。
进入例子:
<?php
echo ob_get_level(),'<br/> ';
ob_start();
echo ob_get_level(),'<br/> ';
ob_start();
echo ob_get_level(),'<br/> ';
?>
输出:
1
2
3
因为output_buffering = 4096,默认存在一个缓冲区(理解名为”buffer_A”区块),所以第一次echo ob_get_level()结果为1;
ob_start()开启了一个缓冲区(理解名为”buffer_B”区块),这时echo ob_get_level()结果为2.
level有点类似数组元素的下标+1
当ob_start()再开启一个缓冲区(理解名为”buffer_C”区块),这时echo ob_get_level()结果为3.
再看例子:
<?php
echo ob_get_level(),'<br/> ';
ob_start();
echo ob_get_level(),'<br/> ';
ob_start();
echo ob_get_level(),'<br/> ';
ob_end_clean();
echo ob_get_level(),'<br/> ';
?>
结果是
1
2
2
因为output_buffering = 4096,默认存在一个缓冲区(理解名为”buffer_A”区块),所以第一次echo ob_get_level()结果为1,且该结果是保存在”buffer_A”区块中;
第一次ob_start()开启了一个缓冲区(理解名为”buffer_B”区块),这时echo ob_get_level()结果为2,且该结果是保存在”buffer_B”区块中。
第二次ob_start()再开启一个缓冲区(理解名为”buffer_C”区块),这时echo ob_get_level()结果为3,且该结果是保存在”buffer_C”区块中
到此为止,所有输出并没有直接发送到web服务器。
这时调用ob_end_clean(),将会把”buffer_C”区块给删除掉,所以结果3就不存在了
再次echo ob_get_level()时,因为没有”buffer_C”区块,所以当前应该是2,且结果保存在”buffer_B”中。
如果把ob_end_clean()改成ob_end_flush()
结果是
1
2
3
2
原理和上面一样,只是ob_end_flush()并没有直接把”buffer_C”区块中的内容直接清除,而是先把区块中的内容flush到他的上一级缓冲区块”buffer_B”中了。这时”buffer_B”区块中的内容变成了"2<br>"."3<br>"。然后再删除缓冲区块”buffer_C”
php缓冲区的更多相关文章
- scanf()中清除输入缓冲区的几种方法归纳
应用场景:我们使用多个scanf()的时候,如果输入缓冲区还有数据的话,那么scanf()就不会询问用户输入,而是直接就将输入缓冲区的内容拿出来用了,这就导致了前面的错误影响到后面的内容,为了隔离这种 ...
- php缓冲区详解
什么是缓冲区(buffer)? 简单而言,缓冲区的作用就是,把输入或者输出的内容先放进内存,而不显示或者读取.至于为什么要有缓冲区,这是一个很广泛的问题,如果有兴趣,可以在网山找下资料. 其实缓冲区最 ...
- 缓冲区溢出利用——捕获eip的傻瓜式指南
[译文] 摘要:为一个简单的有漏洞程序写一个简单的缓冲区溢出EXP,聚焦于遇到的问题和关键性的教训,提供详细而彻底的描述 内容表:1. I pity the fool, who can't smash ...
- SEED信息安全实验系列:缓冲区溢出漏洞实验
缓冲区溢出漏洞实验 本课程详细出自http://www.shiyanlou.com/courses/231,转载请注明出处. 一.实验描述 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情 ...
- Apache service named reported the following error(OS 10055)由于系统缓冲区空间不足或队列已满解决办法?
apache启动失败报错: The Apache service named reported the following error:>>> AH00451: no listeni ...
- c/c++ 缓冲区的刷新
利用string 对象查看缓冲区的变化,因为每个string对象在输入时会以空格作为分界. #include<iostream> #include<string> using ...
- PHP的输出缓冲区(转)
什么是缓冲区?简单而言,缓冲区的作用就是,把输入或者输出的内容先放进内存,而不显示或者读取.至于为什么要有缓冲区,这是一个很广泛的问题,如果有兴趣,可以在网山找下资料.其实缓冲区最本质的作用就是,协调 ...
- Java NIO2:缓冲区
什么是缓冲区 一个缓冲区对象是固定数量的数据的容器,其作用是一个存储器,或者分段运输区,在这里数据可被存储并在之后用于检索.缓冲区像前篇文章讨论的那样被写满和释放,对于每个非布尔原始数据类型都有一个缓 ...
- geotrellis使用(十)缓冲区分析以及多种类型要素栅格化
目录 前言 缓冲区分析 多种类型要素栅格化 总结 参考链接 一.前言 上两篇文章介绍了如何使用Geotrellis进行矢量数据栅格化以及栅格渲染,本文主要介绍栅格化过程中常用到的缓冲区分 ...
- geotrellis使用(十六)使用缓冲区分析的方式解决投影变换中边缘数据值计算的问题
Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html 目录 前言 问题探索 采样说明 实现方案 总结 一.前言 ...
随机推荐
- python-2:爬取某个网页(虎扑)帖子的标题做词云图
关键词:requests,BeautifulSoup,jieba,wordcloud 整体思路:通过requests请求获得html,然后BeautifulSoup解析html获得一些关键数据,之后通 ...
- Python Set intersection() 方法
描述 intersection() 方法用于返回两个或更多集合中都包含的元素,即交集. 语法 intersection() 方法语法: set.intersection(set1, set2 ... ...
- Voting CodeForces - 749C (set,模拟)
大意: n个人, 两个党派, 轮流投票, 两种操作(1)ban掉一个人 (2)投票, 每轮一个未被ban的人可以进行一次操作(1)或操作(2), 求最终哪个党派得票最多. 显然先ban人会更优, 所以 ...
- java.lang.IllegalArgumentException: id to load is required for loading
java.lang.IllegalArgumentException: id to load is required for loading at org.hibernate.event.LoadEv ...
- TCP的三次握手与四次挥手理解及面试题
TCP的三次握手与四次挥手理解及面试题(很全面) 转载自:https://blog.csdn.net/qq_38950316/article/details/81087809 本文经过借鉴书籍资料.他 ...
- docker之本地连接
docker安装成功,之后我们需要连接进入docker中,这里罗列连接方式 1. Windows7 一般的虚拟ip地址: 192.168.99.100 查看ip地址: 1) C:\Users\thi ...
- java面试题全集(下)
这部分主要是开源Java EE框架方面的内容,包括Hibernate.MyBatis.Spring.Spring MVC等,由于Struts 2已经是明日黄花,在这里就不讨论Struts 2的面试 ...
- 383-基于kintex UltraScale XCKU040的双路QSFP+光纤PCIe 卡
一.板卡概述 本板卡系我司自主研发,基于Xilinx UltraScale Kintex系列FPGA XCKU040-FFVA1156-2-I架构,支持PCIE Gen3 x8模式的高速信号处理板卡 ...
- apache 修改文件上传大小限制
Windows 环境下的修改方法 ================================================================ 第一步:修改在php5下POST文件 ...
- feign请求写法
@FeignClient(value = "test", url = "${proxy.srvs.test:}") public interface ISubS ...