php的缓冲区问题
以下内容是看了别人的讲解和自己调试后对php缓冲的一些理解。代码来自http://bbs.csdn.net/topics/110161976
ob_start(); //打开一个输出缓冲区,所有的输出信息不再直接发送到浏览器,而是保存在输出缓冲区里面。
ob_clean(); //删除内部缓冲区的内容,不关闭缓冲区(不输出)。
ob_end_clean(); //删除内部缓冲区的内容,关闭缓冲区(不输出)。
ob_get_clean(); //返回内部缓冲区的内容,关闭缓冲区。相当于执行 ob_get_contents() and ob_end_clean()
ob_flush(); //发送内部缓冲区的内容到server,删除缓冲区的内容,不关闭缓冲区。
ob_end_flush(); //发送内部缓冲区的内容到server,删除缓冲区的内容,关闭缓冲区。
ob_get_flush(); //返回内部缓冲区的内容,并关闭缓冲区,发送内部缓冲区的内容到server。相当于ob_end_flush()并返回缓冲区内容。
flush(); //把server的缓冲区内容刷新到浏览器。
ob_get_contents(); //返回缓冲区的内容,不输出。
ob_get_length(); //返回内部缓冲区的长度,如果缓冲区未被激活,该函数返回FALSE。
ob_get_level(); //获取缓冲区的嵌套等级,如果默认开启了缓存,那个第一次使用ob_start的时候,该函数返回2,。
1.打开了php输出缓存: echo,print -> php output_buffring -> server buffering -> browser buffering -> browser display 2.未打开php输出缓存: echo,print -> server buffering -> browser buffering -> browser display
下面借用几个例子讲解一下过程
ob_start();
echo 'level1='.ob_get_level().'<br/>';
//ob_end_flush();
ob_start();
echo 'level2='.ob_get_level().'<br/>';
ob_start();
echo 'level3='.ob_get_level().'<br/>';
ob_end_flush();
ob_end_flush();
ob_end_flush();
会输出2,3,4
因为我的php配置中,默认是打开缓冲,使用一开始level就是1,我们自己调用ob_start的时候,level就是2了,就是嵌套了两层,类似于之前有一个栈元素,现在有push了一个,下面的以此类推,如果我们在第三行加入ob_end_flush,把倒数第三行的ob_end_flush去掉,那么第三行执行后,就会把缓冲的内容输出到server,我的是Apache,然后关闭最上层的缓冲区,相当于pop栈,这时候level等于1,所以会输出2,2,3.
ob_start();
echo 'hello';//此处并不会在页面中输出
$a = ob_get_level();
$b = ob_get_contents();//获得缓存结果,赋予变量
ob_clean();
echo 'level:'.$a.',ouput:'.$b.'<br>';
输出 level2 ouput hello
ob_start后会开启第一个缓冲区,所以level是2,然后ob_get_contents会把缓冲区的内容取出来,然后ob_clean会清楚缓冲区的内容,但是不会关闭缓冲区。
大概说一下以上的函数的作用,
ob_start是开启一个新的缓冲区,push进当前的缓冲区栈顶,ob_xxx_clean和ob_xxx_flush系列函数,clean是清空缓冲区的,但是他不会把内容输出到server,但是flush不仅清空,还会把内容输入到server,带get的是先返回缓冲区内容,然后再清空缓冲区或者输出到server再清空缓冲区,而且最后都会关闭缓冲区,带end的是不返回内容直接清空缓冲区或者输出内容到server再清空缓冲区,而且最后也都会关闭缓冲区,什么都不带的就是直接清空缓冲区或者输入内容到server,但是这个系列的函数不会关闭缓冲区。level函数是发那会当前的缓冲区栈的前套数。
- Lombok介绍、使用方法和总结
- JDK1.7源码分析01-Collection
- Spring boot自定义启动字符画(banner)
- 产品解析:Github Atom
- Docker+Jenkins持续集成环境(5): android构建与apk发布
- Docker+Jenkins持续集成环境(4):使用etcd+confd实现容器服务注册与发现
- 易企秀前端压缩源码分析与还原
- 关于 JS 拖拽功能的冲突问题及解决方法
- 使用 SVG 和 JS 创建一个由星形变心形的动画
- 如何使用 Bootstrap 搭建更合理的 HTML 结构
- Java遍历Map对象的四种方式
- java 线程public void run()中值如何返回
- Jackson与spring框架整合的坑
- spring shiro整合时自动注入的问题
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- 《大话数据结构》线性表的顺序存储结构
- 《啊哈算法》桶排序详解
- 你不得不知道的Git常用命令
- Java中静态代码块、代码块以及构造函数执行顺序详解
- 手写一个JDK1.7的简版HashMap
- MySQL存储过程创建与使用
- 一些有意思的JavaScript代码片段
- Flutter 完成全平台制霸:实现 Windows 应用支持
- python包:urllib——使用urllib下载无限制链接图片
- 初探 TensorFlow.js
- 如何使用 Apache Directory Studio 连接 JumpCloud
- 0812-5.16.2-如何获取CDSW上提交Spark作业的真实用户
- GLMM:广义线性混合模型(遗传参数评估)
- 特征锦囊:今天一起搞懂机器学习里的L1与L2正则化
- 【一天一大 lee】二叉搜索树的最近公共祖先 (难度:简单) - Day2020092