$a = ob_get_contents();
error_log($a,3,$path);  // 会出现2次
file_put_contents($path,$a); // 只出现1次


多级缓冲 :

<?phpob_start();echo 'aaa___1111';$a = ob_get_contents();$dir = dirname(__FILE__);file_put_contents($dir.'/aaa___1111.log',$a);ob_start();echo 'bbbb___22222';
$b = ob_get_contents();file_put_contents($dir.'/bbbb___22222.log',$b);//ob_end_flush();//冲刷出(送出)输出缓冲区内容并关闭缓冲,区别在于 $c 会有 $b 的内容
ob_end_clean();//清空(擦除)缓冲区并关闭输出缓冲, $c 没有 $b 的内容$c = ob_get_contents();
file_put_contents($dir.'/cccc___33333.log',$c);
ob_end_flush();

<?phpfor ($i = 0; $i < 5; $i++) {echo $i;ob_flush(); //如何开启缓存的话,要加这句话flush();sleep(1);
}

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

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

第一个参数:回调函数,可选。在缓存输出前可以对其进行过滤或其他处理。最常见的用法是ob_start(‘ob_gzhandler’),即对缓存的数据进行gzip压缩后再发送给客户端。
第二个参数:缓存块的大小,可选。如果被缓存的内容达到或操作缓存块的大小,缓存会自动输出。默认值是0,指不限定大小,缓存到结束为止。还有个特殊值1,代表chunk_size=4096。
第三个参数:是否擦除缓存,可选,默认是true,如果设置为false,则在脚本执行结束前,缓存都不会被清除。
可以使用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函数,这点似乎不常遇到,遇到的时候记得去查手册吧。
flush()和ob_flush()
这两个函数的使用怕是很多人最迷惑的一个问题,手册上对两个函数的解释也语焉不详,没有明确的
指出它们的区别,似乎二者的功能都是刷新输出缓存。
但在我们文章一开始的代码中如果讲fush()替换成ob_flush(),
程序就再不能正确执行了。显然,它们是有区别的,
否则也手册中直接说明其中一个是另外一个函数的别名即可了,
没必要分别说明。那么它们的区别到底是什么呢?
反复研究了手册的说明,参考了手册中一些人的留言,
自己琢磨应该是这样的:
在没有开启缓存时,脚本输出的内容都在服务器端处于等待输出的状态,flush()可以将等待输出的内容立即发送到客户端。
开启缓存后,脚本输出的内容存入了输出缓存中,
这时没有处于等待输出状态的内容,你直接使用flush()不会向客户端发出任何内容。而ob_flush()的作用就是将本来存在输
出缓存中的内容取出来,设置为等待输出状态,
但不会直接发送到客户端,这时你就需要先使用ob_flush()再使用flush(),客户端才能立即获得脚本的输出。
也就是说本文开头的脚本,可以根据缓存开启与否,
有如下几种不同的写法:
注:以下代码都未考虑IE缓存必须大于256字节才输出的问题,如在IE下测试,请在代码开始加一句:“echo str_repeat(‘ ‘,256)”


也就是说,ob_flush()将 ob 缓存输入到程序缓存,flush()将程序缓存输出到浏览器缓存。


Output Control 函数详解


http://www.admin10000.com/document/1100.html

105.输出控制缓存相关推荐

  1. php缓存输出压缩,PHP控制输出:缓存并压缩动态页面的简单示例

    这篇文章主要为大家详细介绍了PHP控制输出:缓存并压缩动态页面的简单示例,具有一定的参考价值,可以用来参考一下. 感兴趣的小伙伴,下面一起跟随512笔记的小玲来看看吧! mod_gzip是一个Apac ...

  2. php缓存输出压缩,PHP_控制PHP的输出:缓存并压缩动态页面,mod_gzip是一个Apache模块,其功 - phpStudy...

    控制PHP的输出:缓存并压缩动态页面 mod_gzip是一个Apache模块,其功能是使用Gzip压缩静态的html页面,遵循IETF标准的浏览器可以接受gzip编码(IE, Netscape等).m ...

  3. php缓存输出压缩,控制PHP的输出:缓存并压缩动态页面

    mod_gzip是一个Apache模块,其功能是使用Gzip压缩静态的html页面,遵循IETF标准的浏览器可以接受gzip编码(IE, Netscape等).mod_gzip可以将页面的下载时间提高 ...

  4. SAP SD基础知识之输出控制(Output Control)

    SAP SD基础知识之输出控制(Output Control) 一,销售的输出类型 Output是用于和商业伙伴及系统交换信息的通信方式.我们可以为不同的销售凭证如报价单,订单,交货单,发票设置out ...

  5. SAS学习笔记之《SAS编程与数据挖掘商业案例》(4)DATA步循环与控制、常用全程语句、输出控制...

    SAS学习笔记之<SAS编程与数据挖掘商业案例>(4)DATA步循环与控制.常用全程语句.输出控制 1. 各种循环与控制 DO组 创建一个执行语句块 DO循环 根据下标变量重复执行DO和E ...

  6. MATLAB格式化输出控制

    MATLAB格式化输出控制 format 默认格式 format short 5字长定点数 format long 15字长定点数 format short e 5字长浮点数 format long ...

  7. SD--如何在输出控制中增加自定义字段

    在sap的输出控制中,我们有时需要增加系统未定义的字段作为条件表的字段,为了实现该需求我们就需要修改增强. 输出控制用到的通讯结构 KOMKBK1 (Output Determination Comm ...

  8. C语言删掉无关变量无输出,C语言变量类型与输出控制用法实例教程

    本文实例讲述了C语言变量类型与输出控制用法,有助于读者很好的对其进行总结与归纳.该实例分享给大家供大家参考借鉴之用.具体如下: 完整实例代码如下: /************************* ...

  9. matlab ip 大端,MATLAB格式化输出控制

    MATLAB格式化输出控制 format 默认格式 format short 5字长定点数 format long 15字长定点数 format short e 5字长浮点数 format long ...

  10. Orange pi GPIO输出控制,裸机点灯大法(二)!

    文章目录 Orange pi GPIO输出控制方式 前言 1.OPi.GPIO安装及使用 2.引脚编号 3.WiringOP-Zero-Python安装及使用 4.WiringOP-Zero 安装及使 ...

最新文章

  1. html弹窗确认取消公告代码,js 弹出确认与取消对话框的四种方法
  2. Python_Mix*OS模块,序列化模块种的json,pickle
  3. shell安装mysql,连接数据库,创建数据库
  4. Linux网络编程 之 IO多路复用poll(九)
  5. c中session的用法
  6. Java零基础入门(五)
  7. 自学简单编程可行吗?
  8. 苹果 CEO 为什么选中了何同学?
  9. java毕业设计开题报告jsp企业电子投票系统|问卷
  10. perl读取文件夹下的文件
  11. 高中数学必考知识点:二元一次不等式(组)及简单的线性规划问题
  12. python提示IndentationError: unexpected indent错误
  13. 阿里 P7 前端高级工程师,都需要掌握哪些技术栈?做为学习方向上的借鉴和参考
  14. 【机器人工具箱学习笔记】第七章 机械臂运动学
  15. html 画星星的坐标,如何使用画布HTML5绘制星星?
  16. 小i机器人与腾讯、商汤等发起成立上海人工智能发展联盟
  17. 如何用matlab读出一个灰度图像各点灰度值大小?
  18. 模仿蚂蚁森林动画效果
  19. [原创]K8Cscan 3.8大型内网渗透自定义扫描器(支持批量C段/B段/A段/IP列表/URL列表/跨网段扫描)
  20. 【ArcGIS】ArcGIS Editor for OpenStreetMap 各版本稳定下载链接

热门文章

  1. 关注电子商务网站开发-《网站中常用的Jquery插件》
  2. Microsoft .Net Remoting系列专题之一:.Net Remoting基础篇
  3. Lesson 05 for Plotting in R for Biologists
  4. net core体系-web应用程序-4asp.net core2.0 项目实战(CMS)-第二章 入门篇-快速入门ASP.NET Core看这篇就够了...
  5. DirectX11 With Windows SDK--13 动手实现一个简易Effects框架、阴影效果绘制
  6. bzoj 2243: [SDOI2011]染色 线段树区间合并+树链剖分
  7. 手把手教你如何加入到github的开源世界!
  8. Sublime Text 收藏笔记
  9. mybatis 3.2.7 与 spring mvc 3.x、logback整合
  10. [转]asp.net webform 与mvc 共享session