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 目录 前言 问题探索 采样说明 实现方案 总结 一.前言 ...
随机推荐
- PostgreSQL-UNION与Order by 冲突
问题描述 union 连接的两个sql 都包含 order SELECT <property1>, <property2> FROM <table1> ORDER ...
- Hdu 4738【tanjan求无向图的桥】割边判定定理 dfn[x] < low[y]
题目: 曹操在长江上建立了一些点,点之间有一些边连着.如果这些点构成的无向图变成了连通图,那么曹操就无敌了.刘备为了防止曹操变得无敌,就打算去摧毁连接曹操的点的桥.但是诸葛亮把所有炸弹都带走了,只留下 ...
- 04、DAT图像文件
DAT是芯片的原始扫描图像,如下图: 注:这两张图来自<Bayesian Inference for Gene Expression and Proteomics>.A是U95Av2芯片的 ...
- qt json操作
json文件结构形式 { "xiao1": [ { "000100": { " ...
- java 正则表达式 复习
正则表达式在日常开发中会经常的接触到,学会了正则可以更有效的对字符进行验证.拆分.替换.判断字符串是否合法等操作... 常用语法: 字符的取值范围 1.[abc] : 表示可能是a,可能是b,也可能是 ...
- JS递归及二叉搜索树的移除节点
1递归含义:在某时某刻某个条件下调用包含自己的函数 2:注意点:⑴递归过程中一定要加限制条件,要不然会陷入死循环: 死循环eg: function f(someP){ f(somP); } f(4); ...
- batch文件改修中遇到的sql问题
代码: <?php ////////////////////////////////////////////////////////// // //ダイハツ車種 car_cd毎 平均価格 JSO ...
- 有准备的面试才能拿到更好的 Offer
http://www.sohu.com/a/331411917_181657 前几天有读者问我,工作不顺利辞职了.本来以为凭借自己的能力和工作经验可以轻松找到更好的工作,结果投了简历,约面试的很少,面 ...
- 一、core 启动设置文件中的错误(启动文件不存在)
一.启动文件不存在 查看 别人的 原因是
- 一、移动端商城 Vue 组件库
一.组件库 移动端商城 Vue 组件库