前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >php的缓冲区问题

php的缓冲区问题

作者头像
theanarkh
发布2019-03-06 10:26:51
9440
发布2019-03-06 10:26:51
举报
文章被收录于专栏:原创分享原创分享

以下内容是看了别人的讲解和自己调试后对php缓冲的一些理解。代码来自http://bbs.csdn.net/topics/110161976

代码语言:javascript
复制
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

下面借用几个例子讲解一下过程

代码语言:javascript
复制
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.

代码语言:javascript
复制
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函数是发那会当前的缓冲区栈的前套数。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-02-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程杂技 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档