以下内容是看了别人的讲解和自己调试后对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_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函数是发那会当前的缓冲区栈的前套数。
php缓冲区的问题很久之前就遇到了,但是一直没有怎么研究,之前图片处理的时候有遇到过操作缓冲区的问题,然后前段时间腾讯面试的时候问了我怎么劫持php的输出,今晚看web性能优化的问题恰好遇到这个知识 ,就研究了一下,以后有机会继续深入研究。