专栏首页原创分享php的缓冲区问题

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函数是发那会当前的缓冲区栈的前套数。

本文分享自微信公众号 - 编程杂技(theanarkh)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-02-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • linux系统调用之write源码解析(基于linux0.11)

    创建新块就是在文件系统的超级块结构中,根据当前块的使用情况,申请一个新的块,并标记这个块已经使用。然后把超级块的信息回写到硬盘,并且返回新建的块号。 我们回到f...

    theanarkh
  • linux copy on write源码分析(基于linux0.11)

    写时复制是有一块内存,由多个进程共享,属性是只读的,当有一个进程对这块内存进行写的时候,系统会先申请一块新的内存给他写。比如进程fork的时候,父子进程对应的物...

    theanarkh
  • UDP协议源码解析之发送

    UDP不是面向连接的协议,发送数据的时候指定目的地址的信息即可以发送。下面是入口函数的代码。

    theanarkh
  • 开源的C#实现WebSocket协议客户端和服务器websocket-sharp组件解析

      很久没有写文章了(至少自己感觉很长时间没有写了),没办法啊,楼主也是需要生活的人啊,这段一直都在找工作什么的。(整天催我代码的人,还望多多谅解啊,我会坚持写...

    彭泽0902
  • FCM---Android系统级推送---你还在用第三方推送?

    FCM是谷歌推出的最新的Android系统级别的消息推送服务(用来替换GCM)。 GCM(Google Cloud Messag...

    用户2802329
  • 服务器上管理Rstudio(Rstudio-server)

    在用R/Rstudio本地处理数据时,数据量很大时往往难以处理,其实在服务器上也可以装Rstudio,服务器版本的Rstudio-server是可以通过服务器的...

    生信编程日常
  • Mesh?无线协议的选择

    智能家居和智能建筑等产品的开发者可以使用大量的无线协议。 Zigbee,Z-Wave,以及专有的无线协议,在这些市场中占据了主导地位,新的进入者还包括Threa...

    半吊子全栈工匠
  • 搞定JVM垃圾回收就是这么简单

    当需要排查各种 内存溢出问题、当垃圾收集称为系统达到更高并发的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节。

    用户2164320
  • jQuery:delegate中select()不起作用的解决方法

    jQuery有一个很好用的delegate(事件委派)功能,可以给当前以及将来(动态添加)的元素绑定一个事件处理函数。 比如下面的例子,动态添加一个输入文本框后...

    菩提树下的杨过
  • 性能优化-MySQL慢查日志的存储格式

    说明: 1、# Time: 180526 1:06:54 -------查询的执行时间 2、# User@Host: root[root] @ loc...

    cwl_java

扫码关注云+社区

领取腾讯云代金券