我理解的要点:

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缓冲区的更多相关文章

  1. scanf()中清除输入缓冲区的几种方法归纳

    应用场景:我们使用多个scanf()的时候,如果输入缓冲区还有数据的话,那么scanf()就不会询问用户输入,而是直接就将输入缓冲区的内容拿出来用了,这就导致了前面的错误影响到后面的内容,为了隔离这种 ...

  2. php缓冲区详解

    什么是缓冲区(buffer)? 简单而言,缓冲区的作用就是,把输入或者输出的内容先放进内存,而不显示或者读取.至于为什么要有缓冲区,这是一个很广泛的问题,如果有兴趣,可以在网山找下资料. 其实缓冲区最 ...

  3. 缓冲区溢出利用——捕获eip的傻瓜式指南

    [译文] 摘要:为一个简单的有漏洞程序写一个简单的缓冲区溢出EXP,聚焦于遇到的问题和关键性的教训,提供详细而彻底的描述 内容表:1. I pity the fool, who can't smash ...

  4. SEED信息安全实验系列:缓冲区溢出漏洞实验

    缓冲区溢出漏洞实验 本课程详细出自http://www.shiyanlou.com/courses/231,转载请注明出处. 一.实验描述 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情 ...

  5. Apache service named reported the following error(OS 10055)由于系统缓冲区空间不足或队列已满解决办法?

    apache启动失败报错: The Apache service named reported the following error:>>> AH00451: no listeni ...

  6. c/c++ 缓冲区的刷新

    利用string 对象查看缓冲区的变化,因为每个string对象在输入时会以空格作为分界. #include<iostream> #include<string> using ...

  7. PHP的输出缓冲区(转)

    什么是缓冲区?简单而言,缓冲区的作用就是,把输入或者输出的内容先放进内存,而不显示或者读取.至于为什么要有缓冲区,这是一个很广泛的问题,如果有兴趣,可以在网山找下资料.其实缓冲区最本质的作用就是,协调 ...

  8. Java NIO2:缓冲区

    什么是缓冲区 一个缓冲区对象是固定数量的数据的容器,其作用是一个存储器,或者分段运输区,在这里数据可被存储并在之后用于检索.缓冲区像前篇文章讨论的那样被写满和释放,对于每个非布尔原始数据类型都有一个缓 ...

  9. geotrellis使用(十)缓冲区分析以及多种类型要素栅格化

    目录 前言 缓冲区分析 多种类型要素栅格化 总结 参考链接 一.前言        上两篇文章介绍了如何使用Geotrellis进行矢量数据栅格化以及栅格渲染,本文主要介绍栅格化过程中常用到的缓冲区分 ...

  10. geotrellis使用(十六)使用缓冲区分析的方式解决投影变换中边缘数据值计算的问题

    Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html 目录 前言 问题探索 采样说明 实现方案 总结 一.前言     ...

随机推荐

  1. 如何用vue封装一个防用户删除的平铺页面的水印组件

    需求 为了防止截图等安全问题,在web项目页面中生成一个平铺全屏的水印 要求水印内容为用户名,水印节点用户不能通过开发者工具等删除 效果 如上图 在body节点下插入水印DOM节点,水印节点覆盖在页面 ...

  2. 运维nslookup语法

    nslookup 查询域名DNS信息的工具 补充说明 nslookup命令 是常用域名查询工具,就是查DNS信息用的命令. nslookup4有两种工作模式,即“交互模式”和“非交互模式”.在“交互模 ...

  3. java 导出自定义样式excel

    由于项目需要 要求导出一个这样的表格 然而 正常导出的表格都是这样婶儿地 这种格式网上demo有很多就不详细说了 ,主要说说上面三行是怎么画的. 第一行大标题,是9行合并成的一行,而且字体大小需要单独 ...

  4. 手把手教你如何安装使用webpack vue cli

    1.安装node.js:https://nodejs.org/en/download/(看电脑的系统是多少位下载相应版本) 我下载的是Windows Installer(.msi) x64 2.打开c ...

  5. Bootstrap4中栅格系统CSS中 col-sm-* col-md-* col-lg-*的意义以及当其同时具有col-xs-* col-sm-* col-md-* col-lg-*的含义

    根据Bootstrap--Grid 中 col-sm-* col-md-* col-lg-* col-xl-*的意义: .col-sm-* 小屏幕 手机 (≥ 576px) .col-md-* 中等屏 ...

  6. 解决错误:无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://shiro.apache.org/tags]

    服务器错误信息如下: 解决方法: 把shiro包中的tld文件(shiro.tld)解压出来放到WEB-INF文件夹下即解决问题. 参考:http://blog.sina.com.cn/s/blog_ ...

  7. ucore Lab2 实验笔记

    ucore Lab2 lab 2 直接执行make qemu-nox会显示 assert 失败: kernel panic at kern/mm/default_pmm.c:277: assertio ...

  8. jquery preventDefault() 方法防止打开不是本站的链接URL

    将以下代码保存为test.html,用浏览器打开即可测试 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...

  9. Xunsearch入门

    Xunsearch入门 简介: 开源免费.高性能.多功能.简单易用的专业全文检索技术方案. 1.Xunsearch安装: (1)官网(http://xunsearch.com)下载 wget http ...

  10. 【POJ3162】Walking Race 树形dp+单调队列+双指针

    题目大意:给定一棵 N 个节点的无根树,边有边权,现生成一个序列 d,d[i] 表示 i 号节点到树上其他节点距离的最大值.给定一个 m,求 d 序列中最大值和最小值之差不超过 m 的最长连续段的长度 ...