当前位置:首页 > 编程技术 > PHP编程 > 正文内容

最详细的PHP flush()与ob_flush()的区别详解

曾经2个月前 (05-07)PHP编程1578

buffer ---- flush()

buffer是一个内存地址空间,Linux系统默认大小一般为4096(1kb),即一个内存页。主要用于存储速度不同步的设备或者优先级不同的 设备之间传办理数据的区域。通过buffer,可以使进程这间的相互等待变少。这里说一个通俗一点的例子,你打开文本编辑器编辑一个文件的时候,你每输入 一个字符,操作系统并不会立即把这个字符直接写入到磁盘,而是先写入到buffer,当写满了一个buffer的时候,才会把buffer中的数据写入磁 盘,当然当调用内核函数flush()的时候,强制要求把buffer中的脏数据写回磁盘。
同样的道理,当执行echo,print的时候,输出并没有立即通过tcp传给客户端浏览器显示, 而是将数据写入php buffer。php output_buffering机制,意味在tcp buffer之前,建立了一新的队列,数据必须经过该队列。当一个php buffer写满的时候,脚本进程会将php buffer中的输出数据交给系统内核交由tcp传给浏览器显示。所以,数据会依次写到这几个地方echo/print -> php buffer -> tcp buffer -> browser

php output_buffering --- ob_flush()

默认情况下,php buffer是开启的,而且该buffer默认值是4096,即1kb。你可以通过在php.ini配置文件中找到output_buffering配置.当echo,print等输出用户数据的时候,输出数据都会写入到php output_buffering中,直到output_buffering写满,会将这些数据通过tcp传送给浏览器显示。你也可以通过 ob_start()手动激活php output_buffering机制,使得即便输出超过了1kb数据,也不真的把数据交给tcp传给浏览器,因为ob_start()将php buffer空间设置到了足够大 。只有直到脚本结束,或者调用ob_end_flush函数,才会把数据发送给客户端浏览器。

这两个函数的使用怕是很多人最迷惑的一个问题,手册上对两个函数的解释也语焉不详,没有明确的指出它们的区别,似乎二者的功能都是刷新输出缓存。但在我们文章一开始的代码中如果讲fush()替换成ob_flush(),程序就再不能正确执行了。显然,它们是有区别的,否则也手册中直接说明其中一个是另外一个函数的别名即可了,没必要分别说明。那么它们的区别到底是什么呢?

在没有开启缓存时,脚本输出的内容都在服务器端处于等待输出的状态 ,flush()可以将等待输出的内容立即发送到客户端。

开启缓存后,脚本输出的内容存入了输出缓存中 ,这时没有处于等待输出状态的内容,你直接使用flush()不会向客户端发出任何内容。而 ob_flush()的作用就是将本来存在输出缓存中的内容取出来,设置为等待输出状态,但不会直接发送到客户端 ,这时你就需要先使用 ob_flush()再使用flush(),客户端才能立即获得脚本的输出。

一. flush和ob_flush的正确顺序,正确应是,先ob_flush再flush,如下: 
ob_flush();
flush();
如果Web服务器的操作系统是windows系统,那顺序颠倒或者不使用ob_flush()也不会出现问题。[有待求证 ] 但是在Linux系统上就无法刷新输出缓冲。

output buffering函数
1.bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )
激活output_buffering机制。一旦激活,脚本输出不再直接出给浏览器,而是先暂时写入php buffer内存区域。
php默认开启output_buffering机制,只不过,通过调用ob_start()函数据output_buffering值扩展到足够 大 。也可以指定$chunk_size来指定output_buffering的值。$chunk_size默认值是0,表示直到脚本运行结束,php buffer中的数据才会发送到浏览器。如果你设置了$chunk_size的大小 ,则表示只要buffer中数据长度达到了该值,就会将buffer中 的数据发送给浏览器。
当然,你可以通过指定$ouput_callback,来处理buffer中的数据。比如函数ob_gzhandler,将buffer中的数据压缩后再传送给浏览器。
第三个参数:是否擦除缓存,可选,默认是true,如果设置为false,则在脚本执行结束前,缓存都不会被清除。
2.ob_get_contents
获取一份php buffer中的数据拷贝。值得注意的是,你应该在ob_end_clean()函数调用前调用该函数,否则ob_get_contents()返回一个空字符中。

可以使用ob_get_contents()以字符串形式获取服务端缓存的数据,
使用ob_end_flush()则会输出被缓存起来的数据,并关闭缓存。
而使用ob_end_clean()则会静默的清除服务端缓存的数据,而不会有任何数据或其他行为。
服务端的缓存是堆叠起来的,也就是说你在开启了ob_start()后,关闭之前,在其内部还 可以开启另外一个缓存ob_start()。

不过你也要务必保证关闭缓存的操作和开启缓存的操作数量一样多。 
ob_start() 可以指定一个回调函数来处理缓存数据,如果一个ob_start()内部嵌套了另一个ob_start(),我们假定,外层的ob_start(),编号是A,内层的ob_start()编号是B,它们各自制定了一个回调函数分别是functionA和functionB,那么在缓存B中的数据输出时,它会先辈funcitonB回调函数处理,再交给外层的functionA回调函数处理,之后才能输出到客户端。

另外,手册说,对于某些web服务器,比如apache,在使用回调函数有可能会改变程序当前的工作目录,解决方法是在回调函数中自行手动把工作目录修改回来,用chdir函数,这点似乎不常遇到,遇到的时候记得去查手册吧。

3.ob_end_flush与ob_end_clean
这二个函数有点相似,都会关闭ouptu_buffering机制。但不同的是,ob_end_flush只是把php buffer中的数据冲(flush/send)到客户端浏览器,而ob_clean_clean将php bufeer中的数据清空(erase),但不发送给客户端浏览器。

ob_end_flush调用之前 ,php buffer中的数据依然存在,ob_get_contents()依然可以获取php buffer中的数据拷贝。

而ob_end_flush()调用之后 ob_get_contents()取到的是空字符串,同时浏览器也接收不到输出,即没有任何输出。

可以使用ob_get_contents()以字符串形式获取服务端缓存的数据,使用ob_end_flush()则会输出被缓存起来的数据,并关闭缓存。
而使用ob_end_clean()则会静默的清除服务端缓存的数据,而不会有任何数据或其他行为。
服务端的缓存是堆叠起来的,也就是说你在开启了ob_start()后,关闭之前,在其内部还可以开启另外一个缓存ob_start()。不过你也要务必保证关闭缓存的操作和开启缓存的操作数量一样多。
ob_start() 可以指定一个回调函数来处理缓存数据,如果一个ob_start()内部嵌套了另一个ob_start(),我们假定,外层的ob_start(),编号是A,内层的ob_start()编号是B,它们各自制定了一个回调函数分别是functionA和functionB,那么在缓存B中的数据输出时,它会先辈funcitonB回调函数处理,再交给外层的functionA回调函数处理,之后才能输出到客户端。

另外,手册说,对于某些web服务器,比如apache,在使用回调函数有可能会改变程序当前的工作目录,解决方法是在回调函数中自行手动把工作目录修改回来,用chdir函数,这点似乎不常遇到,遇到的时候记得去查手册吧。


扫描二维码推送至手机访问。

版权声明:本文由珍惜发布,如需转载请注明出处。

本文链接:https://www.zp68.com/article/60.html

分享给朋友:

“最详细的PHP flush()与ob_flush()的区别详解” 的相关文章

PHP中private、public、protected的区别详解

先简单粗俗的描述下:public 表示全局,类内部外部子类都可以访问;private表示私有的,只有本类内部可以使用;protected表示受保护的,只有本类或子类或父类中可以访问;再啰嗦的解释下:一、public: 公有类型在子类中可以通过 self::属性名(或方法名)  调...

PHP将两个MP3文件进行合并,可以多个MP3文件合并

以下代码是基于PHP 7.x 的,版本小于7.x 的请自行将 代码中的__construct 改为 mp3<?php class mp3 { var $str; var $time; var $frames; // ...

php实现边执行边输出的效果

客户端的请求到web服务器,web服务器再调用PHP代码;PHP返回内容到web服务器,web服务器再返回给客户端边执行边输出就需要web服务器和PHP都不缓存内容首先, Nginx不缓存PHP返回的内容header('X-Accel-Buffering: no'...

php 使用curl_multi_init批量请求

抓取多个URL地址是Web开发中常见的需求,使用PHP的curl库可以简化这个过程。本文将详细介绍如何使用PHP的curl库同时请求多个URL地址,并提供具体的代码案例和注释。curl库介绍curl是一个常用的开源网络传输工具,可以通过各种协议(如HTTP、FTP、TELNET)在不同的平台上进行数...

PHP 多线程 curl_multi_init 的使用 PK curl_init 看看那个更快

php中可以通过CURL处理HTTP请求,其中curl_init()是单线程模式,如果需要对事务处理走多线程模式,那么就需要用到curl_multi_init()函数。本案例用来测试大并发的情况下 curl_multi_init() 到底比 curl_init() 快多少。话不多少,直接上...

评论列表

游客
1周前 (07-11)

内容很有深度!http://www.ddman.net

游客
1周前 (07-11)

看帖回帖一条路!http://www.2qukuai.com

游客
1周前 (07-11)

网站做得不错http://ydbj.fulihua0415.com

游客
1周前 (07-11)

很有看点!http://7n2ns.elawojtowicz.com/27/4.html

游客
1周前 (07-11)

不灌水就活不下去了啊!http://e3ir2e.xmyw.net

游客
1周前 (07-11)

支持一下,下面的保持队形!http://tcfj.sc-mty.cn

游客
1周前 (07-11)

楼上的心情不错啊!http://rlz9b.lkjk.cn

游客
1周前 (07-11)

看了这么多帖子,第一次看到这么经典的!http://z23ai.bjmrhd.com/27/4.html

游客
1周前 (07-11)

看在楼主的面子上,认真回帖!http://www.gxmlm.com

游客
1周前 (07-11)

雷锋做好事不留名,都写在帖子里!http://ar2h.fsxjlw.com

游客
1周前 (07-11)

楼主主机很热情啊!http://ajj.lkjk.cn

游客
1周前 (07-11)

支持楼上的!http://t8nt.zhoutan.net

游客
7天前

东方不败外加灭绝师太啊!http://s05yi.schhzsjt.com

游客
7天前

论坛的帖子越来越有深度了!http://t1hhqc.schhzsjt.com

游客
7天前

楼主今年多大了?http://tw9ms.zhoutan.net

游客
7天前

收藏了,怕楼主删了!http://2ao4f9.lifeland.com.cn

游客
7天前

楼主的文笔不错!http://kc7.tuopi120.com

游客
7天前

顶顶更健康!http://zu23.schtwl.com

游客
7天前

今天过得很不爽!http://axx1s.hooby.cn

游客
7天前

文章论点明确,论据充分,说服力强。http://4oii.hooby.cn

游客
7天前

写得实在太好了,我唯一能做的就是默默顶贴!http://064v1.ymyzncp.com

游客
7天前

楼主的等级很高啊!http://vg69.gdlydzkj.cn

游客
7天前

写得实在太好了,我唯一能做的就是默默顶贴!http://59pg.gdlydzkj.cn

游客
7天前

今天是个特别的日子,值得纪念!http://obsx50.schhzsjt.com

游客
7天前

楼主内心很强大!http://0qt.nbqywh.com

游客
7天前

很多天不上线,一上线就看到这么给力的帖子!http://mp1.ynbzwhcb.com

游客
7天前

大神好强大!http://yfh2.fulihua0415.com

游客
7天前

语言表达流畅,没有冗余,读起来很舒服。http://8iwi1a.sc-mty.cn

游客
7天前

坚持回帖!http://vhd.lkjk.cn

游客
7天前

这里的资源非常丰富,帮助我解决了很多问题。http://bv9say.zwygmy.com

游客
7天前

今天上网不回帖,回帖就回精华帖!http://r2m.sy-cl.com

游客
7天前

顶!顶!顶!http://z4kcb.sy-cl.com

游客
7天前

有钱、有房、有车,人人都想!http://l1ggis.tjbyj.com

游客
7天前

写得实在太好了,我唯一能做的就是默默顶贴!http://wvy3j9.51ysh.com

游客
7天前

很给力!http://3s0t.lkjk.cn

游客
7天前

我就搞不明白了,看帖回帖能死人么,居然只有我这么认真的在回帖!http://3b2spy.lostockhallband.com

游客
7天前

在这个版块混了这么久了,第一次看见这么给你的帖子!http://7e7875.xmyw.net

游客
7天前

知识就是力量啊!http://9159.enleader.com

游客
7天前

楼主英明!http://6ti5x.lkjk.cn

游客
7天前

赞一个!http://dc2fu.aochengyy.com

游客
7天前

十分赞同楼主!http://pzik4.jxkspx.com

游客
7天前

大神好强大!http://c5g.zhoutan.net

游客
6天前

楼主你想太多了!http://pch.fsxjlw.com

游客
6天前

楼主说的我也略懂!http://a0j.fsxjlw.com

游客
6天前

支持楼上的!http://e540.lkjk.cn

游客
6天前

论坛的人气不行了!http://ak743j.lyshuidai.com

游客
6天前

顶顶更健康!http://kk8sa.lkjk.cn

游客
6天前

好好学习楼主的帖子!http://7oqrl.kelebektr.com/01/3.html

游客
6天前

我对楼主的敬仰犹如滔滔江水绵延不绝!http://zv60c4.jkd4whd.cn

游客
6天前

楼上的能详细介绍一下么?http://2ec.931121.com

游客
6天前

写的太好啦,评论一个http://4zz8w.499965.com/20240712/4.html

游客
6天前

楼主的帖子越来越有深度了!http://s1d8.zhengshanwang.cn

游客
6天前

收藏了,很不错的内容!http://jtw1t.lkjk.cn

游客
6天前

收藏了,改天让朋友看看!http://n9o.pistpyh.cn

游客
6天前

很经典,收藏了!http://2ghi6.lkjk.cn

游客
6天前

楼上的心情不错啊!http://bdp24.lkjk.cn

游客
6天前

感谢楼主的推荐!http://of9gv.qw1m.com/07/4.html

游客
6天前

东方不败外加灭绝师太啊!http://ladei.cn/news/25c099524.html

游客
6天前

终于看完了,很不错!http://ji8.lkjk.cn

游客
5天前

怪事年年有,今年特别多!http://bu9pf.lkjk.cn

游客
5天前

一口气看完了,我要下去回味回味了!http://njvp7.honda-taiwan.com/8/4.html

游客
5天前

这么经典的话只有楼主能想到!http://www.kdhlpt.com/yaowen/774306638.html

游客
5天前

帖子很有深度!http://www.kdhlpt.com/yaowen/288346989.html

游客
5天前

信楼主,得永生!http://www.kdhlpt.com/yaowen/947721416.html

游客
5天前

每天顶顶贴,一身轻松啊!http://www.kdhlpt.com/yaowen/766174550.html

游客
5天前

在这个版块混了这么久了,第一次看见这么给你的帖子!http://www.kdhlpt.com/yaowen/409462990.html

游客
5天前

你觉得该怎么做呢?http://www.kdhlpt.com/yaowen/564628669.html

游客
5天前

这么经典的话只有楼主能想到!http://www.kdhlpt.com/yaowen/316444509.html

游客
5天前

学习雷锋,好好回帖!http://tlh3y.zghc168.com/07/4.html

游客
5天前

看在楼主的面子上,认真回帖!http://zjhj.ynport.net/test/609948135.html

游客
5天前

楼主好聪明啊!http://iqfn.ynport.net/test/268483824.html

游客
5天前

论坛的人气不行了!http://maur.ynport.net/test/772390806.html

游客
5天前

青春不在了,青春痘还在!http://llmb.ynport.net/test/514523689.html

游客
5天前

好好学习楼主的帖子!http://9tvrs.wnljgg.com/01/5.html

游客
5天前

知识就是力量啊!http://aqiz.ynport.net/test/156631858.html

游客
5天前

经典,收藏了!http://diov.ynport.net/test/984906254.html

游客
5天前

感觉不错!http://fsld.ynport.net/test/538198197.html

游客
5天前

支持一下!http://asja.ynport.net/test/242542390.html

游客
5天前

楼主很有艺术范!http://vopx.ynport.net/test/105553888.html

游客
5天前

顶顶更健康!http://mqfb.ynport.net/test/342293667.html

游客
5天前

看帖、回帖、拿分、走人http://msvi.ynport.net/test/770596320.html

游客
5天前

写得实在太好了,我唯一能做的就是默默顶贴!http://gmaw.ynport.net/test/936031299.html

游客
5天前

这一年啥事没干,光研究楼主的帖子了!http://awbg.ynport.net/test/456511456.html

游客
5天前

楼上的心情不错啊!http://miaf.ynport.net/test/007967021.html

游客
5天前

支持一下!http://zpsv.ynport.net/test/061583385.html

游客
5天前

收藏了,改天让朋友看看!http://favr.ynport.net/test/857464771.html

游客
5天前

楼上的这是啥态度呢?http://qfey.ynport.net/test/157190805.html

游客
5天前

我回帖楼主给加积分吗?http://yeay.ynport.net/test/893899993.html

游客
5天前

好帖子!http://38off8.lkjk.cn

游客
5天前

这个帖子好无聊啊!http://rnoc.ynport.net/test/207661377.html

游客
5天前

读了楼主的帖子,顿时马桶就通了。。。http://tuiw.ynport.net/test/201216857.html

游客
5天前

观点鲜明,立场坚定,作者态度明确。http://vdwq.ynport.net/test/072596954.html

游客
5天前

楼主今年多大了?http://rvse.ynport.net/test/233181101.html

游客
5天前

支持楼上的!http://ghqx.ynport.net/test/813278084.html

游客
5天前

东方不败外加灭绝师太啊!http://seoe.ynport.net/test/686571760.html

游客
5天前

楼主的头像是本人吗?http://dnaz.ynport.net/test/118000062.html

游客
5天前

刚看见一个妹子,很漂亮!http://0qyf.lkjk.cn

游客
5天前

大神就是大神,这么经典!http://ndgd.ynport.net/test/262124190.html

游客
5天前

坚持回帖!http://grln.ynport.net/test/374484059.html

游客
5天前

被楼主的逻辑打败了!http://bimj.ynport.net/test/199750091.html

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。