PHP输出缓存控制详解ob-start,flush,ob-flush_第1页
PHP输出缓存控制详解ob-start,flush,ob-flush_第2页
PHP输出缓存控制详解ob-start,flush,ob-flush_第3页
PHP输出缓存控制详解ob-start,flush,ob-flush_第4页
PHP输出缓存控制详解ob-start,flush,ob-flush_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、PHP输出缓存控制详解ob_start,flush,ob_flushfor($i=0;$i10;$i+)echo$i.;flush();sleep(1);有了解过PHP缓存输出控制函数的朋友肯定对上面这段代码很熟悉,它想实现的效果是每个1秒输出1个数字,完成全部输出需要10秒,不过实际执行中你会发现奇怪的现象,有些人或者有些时候它的表现如你所愿,而有些人或者有些时候却是10秒后才会一次性输出10个数字。我曾经为此抓狂不已,有朋友留言说这个情况往往是因为IE的缓存必须达到256个字符才会输出,可实际上我之前也考虑到IE的情况,可依旧会有时灵时不灵的情况。今天仔细读过手册才明白,这些不可预料的现象

2、是有它的理由的。原来php.ini中有两个关键参数会影响到php的缓存输出控制:参数1:output_buffering:on/off或者整数。设置为on时,将在所有脚本中使用输出缓存控制,不限制缓存的大小。而设置为整数时,如output_buffering=4096,当缓存数据达到4096字节时会自动输出刷新缓存。而这个参数的不同正是导致以上代码在不同时候执行结果不同的原因。当output_buffering关闭时,脚本所有的输出(echo)都会即时发送到客户端,执行上面代码时就是每秒输出一个数字。而开启output_buffering后,输出内容就会先缓存在服务端,直到脚本结束时才一起发送

3、给客户端。参数2:implicit_flush:on/off。设定ON意味着,当脚本有输出时,自动立即发送到客户端。相当于在echo后自动加flush()。php缓存输出控制的相关函数:ob_start()第一个参数:回调函数,可选。在缓存输出前可以对其进行过滤或其他处理。最常见的用法是ob_start(ob_gzhandle广),即对缓存的数据进行gzip压缩后再发送给客户端。第二个参数:缓存块的大小,可选。如果被缓存的内容达到或操作缓存块的大小,缓存会自动输出。默认值是0,指不限定大小,缓存到结束为止。还有个特殊值1,代表chunk_size=4096。第三个参数:是否擦除缓存,可选,默认

4、是true,如果设置为false,则在脚本执行结束前,缓存都不会被清除。可以使用ob_get_contents()以字符串形式获取服务端缓存的数据,使用ob_end_flush()则会输出被缓存起来的数据,并关闭缓存。而使用ob_end_clean()则会静默的清除服务端缓存的数据,而不会有任何数据或其他行为。服务端的缓存是堆叠起来的,也就是说你在开启了ob_start()后,关闭之前,在其内部还可以开启另外一个缓存ob_start()。不过你也要务必保证关闭缓存的操作和开启缓存的操作数量一样多。ob_start()可以指定一个回调函数来处理缓存数据,如果一个ob_start()内部嵌套了另一

5、个ob_start(),我们假定,夕卜层的ob_start(),编号是A,内层的ob_start()编号是B,它们各自制定了一个回调函数分别是functionA和functionB,那么在缓存B中的数据输出时,它会先辈funcitonB回调函数处理,再交给外层的functionA回调函数处理,之后才能输出到客户端。另外,手册说,对于某些web服务器,比如apache,在使用回调函数有可能会改变程序当前的工作目录,解决方法是在回调函数中自行手动把工作目录修改回来,用chdir函数,这点似乎不常遇到,遇到的时候记得去查手册吧。flush()和ob_flush()这两个函数的使用怕是很多人最迷惑的一

6、个问题,手册上对两个函数的解释也语焉不详,没有明确的指出它们的区别,似乎二者的功能都是刷新输出缓存。但在我们文章一开始的代码中如果讲fush()替换成ob_flush(),程序就再不能正确执行了。显然,它们是有区别的,否则也手册中直接说明其中一个是另外一个函数的别名即可了,没必要分别说明。那么它们的区别到底是什么呢?反复研究了手册的说明,参考了手册中一些人的留言,自己琢磨应该是这样的:在没有开启缓存时,脚本输出的内容都在服务器端处于等待输出的状态,flush()可以将等待输出的内容立即发送到客户端。开启缓存后,脚本输出的内容存入了输出缓存中,这时没有处于等待输出状态的内容,你直接使用flush

7、()不会向客户端发出任何内容。而ob_flush()的作用就是将本来存在输出缓存中的内容取出来,设置为等待输出状态,但不会直接发送到客户端,这时你就需要先使用ob_flush()再使用flush(),客户端才能立即获得脚本的输出。也就是说本文开头的脚本,可以根据缓存开启与否,有如下几种不同的写法:注:以下代码都未考虑IE缓存必须大于256字节才输出的问题,如在IE下测试,请在代码开始加一句:“echostr_repeat(,256)”写法1:output_buffering=offimplicit_flush=offfor($i=0;$i10;$i+)echo$i.;flush();sleep

8、(1);写法2:output_buffering=onimplicit_flush=offfor($i=0;$i10;$i+)echo$i.;ob_flush();flush();sleep(1);写法3:output_buffering=offimplicit_flush=offob_start();for($i=0;$i10;$i+)echo$i.;ob_flush();flush();sleep(1);写法4:output_buffering=onimplicit_flush=offob_end_flush();for($i=0;$i10;$i+)echo$i.;flush();sleep(1);写法5:output_buffering=onimplicit_flush=offob_end_clean();for($i=0;$i10;$i+)echo$i.;flush();sleep(1);写法6:output_buffering=on;implicit_flush=onob_end_clean();/或者ob_end_flush();for($i=0;$i10;$i+)echo$i.;sleep(1);写法7:output_buffering=on;implicit_flush=onob_end_clean

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论