php的缓冲区问题

时间:2022-06-18
本文章向大家介绍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函数是发那会当前的缓冲区栈的前套数。