深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)


Posted in PHP onFebruary 06, 2013

有关php的ob_flush()与flush()使用方法

注意:ob_flush()和flush()这两个函数一般要一起使用,顺序是先ob_flush(),然后flush(),它们的作用是刷新缓冲区。
这里具体的说下什么时候要用到刷新缓冲区和为什么要刷新缓冲区。

一、什么时候要刷新缓冲区

当程序中用到file_get_contents()和file_put_contens()这两个函数时,或程序中执行类似的“读写”功能或向浏览器执行输出操作时,会用到ob_flush()和flush()来刷新缓冲区。

二、为什么要刷新缓冲区

用file_get_contents()和file_put_content()为例进行讲解。

file_get_contents()和file_put_conents()这两个函数分别执行读取数据和写入数据操作,数据是先被读到内存中然后在写入文件中的,因为读取的速度比写入的速度要快,所以当你的数据被读完的时候不代表数据也写入完毕,这个时候多读的内容就会被暂时放到缓冲区中(内存),在这里需要强调一下,其实数据读取和写入是两个非常快的动作哦。

还用一种解释(当程序向浏览器执行输出操作时),个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。如果你不想让程序执行完毕才向浏器输出,那么你也可以用到ob_flush()和flush()来刷新缓存。

其实,flush()还有一种用途,就是在没结束程序之前就进行输出,即一个循环还没结束就可以把部分结果输出到浏览器上,这个效果很类似 ajax的异步传输效果。

深入理解ob_flush和flush的区别

ob_flush/flush在手册中的描述, 都是刷新输出缓冲区, 并且还需要配套使用, 所以会导致很多人迷惑…

其实, 他们俩的操作对象不同, 有些情况下, flush根本不做什么事情..

ob_*系列函数, 是操作PHP本身的输出缓冲区.

所以, ob_flush是刷新PHP自身的缓冲区.

而flush, 严格来讲, 这个只有在PHP做为apache的Module(handler或者filter)安装的时候, 才有实际作用. 它是刷新WebServer(可以认为特指apache)的缓冲区.

在apache module的sapi下, flush会通过调用sapi_module的flush成员函数指针, 间接的调用apache的api: ap_rflush刷新apache的输出缓冲区, 当然手册中也说了, 有一些apache的其他模块, 可能会改变这个动作的结果..

有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。

甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到 </table> 标记之前,不会显示出整个表格。

一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容所以, 正确使用俩者的顺序是. 先ob_flush, 然后flush,

当然, 在其他sapi下, 不调用flush也可以, 只不过为了保证你代码的可移植性, 建议配套使用.

PHP 相关文章推荐
用文本文件制作留言板提示(下)
Oct 09 PHP
php 数组的创建、调用和更新实现代码
Mar 09 PHP
深入PHP empty(),isset(),is_null()的实例测试详解
Jun 06 PHP
使用PHP Socket写的POP3类
Oct 30 PHP
destoon实现会员商铺中指定会员或会员组投放广告的方法
Aug 21 PHP
利用“多说”制作留言板、评论系统
Jul 14 PHP
ThinkPHP实现图片上传操作的方法详解
May 08 PHP
Laravel学习教程之View模块详解
Sep 18 PHP
PHP基于curl实现模拟微信浏览器打开微信链接的方法示例
Feb 15 PHP
PHP设计模式之建造者模式(Builder)原理与用法案例详解
Dec 12 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
Apr 04 PHP
PHP RabbitMQ消息列队
May 11 PHP
php中设置index.php文件为只读的方法
Feb 06 #PHP
php中选择什么接口(mysql、mysqli)访问mysql
Feb 06 #PHP
php连接mssql的一些相关经验及注意事项
Feb 05 #PHP
用php随机生成福彩双色球号码的2种方法
Feb 04 #PHP
php获取服务器信息的实现代码
Feb 04 #PHP
关于PHP实现异步操作的研究
Feb 03 #PHP
PHP数组循环操作详细介绍 附实例代码
Feb 03 #PHP
You might like
叶罗丽:为什么大家对颜冰这对CP非常关心,却对金茉两人十分冷漠
2020/03/17 国漫
漂亮但不安全的CTB
2006/10/09 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
php获取ajax的headers方法与内容实例
2017/12/27 PHP
图片完美缩放
2006/09/07 Javascript
爱恋千雪-US-AscII加密解密工具(网页加密)下载
2007/06/06 Javascript
js的with语句使用方法
2007/09/21 Javascript
jQuery 源码分析笔记(2) 变量列表
2011/05/28 Javascript
js 调用百度地图api并在地图上进行打点添加标注
2014/05/13 Javascript
浅析javascript中function 的 length 属性
2014/05/27 Javascript
JavaScript中getUTCMinutes()方法的使用详解
2015/06/10 Javascript
一起学写js Calender日历控件
2016/04/14 Javascript
js实现3d悬浮效果
2017/02/16 Javascript
用nodeJS搭建本地文件服务器的几种方法小结
2017/03/16 NodeJs
jQuery插件HighCharts绘制简单2D柱状图效果示例【附demo源码】
2017/03/21 jQuery
jQuery复合事件结合toggle()方法的用法示例
2017/06/10 jQuery
NodeJS 实现手机短信验证模块阿里大于功能
2017/06/19 NodeJs
JS 学习总结之正则表达式的懒惰性和贪婪性
2017/07/03 Javascript
ReactNative实现图片上传功能的示例代码
2017/07/11 Javascript
极简主义法编写JavaScript类
2017/11/02 Javascript
three.js实现3D影院的原理的代码分析
2017/12/18 Javascript
如何基于原生javaScript生成带图片的二维码
2019/11/21 Javascript
解决vue的router组件component在import时不能使用变量问题
2020/07/26 Javascript
[01:51]开启你的城市传奇 完美世界城市挑战赛开始报名
2018/10/09 DOTA
python实现生成Word、docx文件的方法分析
2019/08/30 Python
python 获取字典键值对的实现
2020/11/12 Python
python实现简单的井字棋游戏(gui界面)
2021/01/22 Python
英国女装网上商店:I Saw It First
2018/10/18 全球购物
英国和爱尔兰最大的地毯零售商:Kukoon
2018/12/17 全球购物
Python使用openpyxl复制整张sheet
2021/03/24 Python
应聘自荐信
2013/12/14 职场文书
初中班主任工作总结2015
2015/05/13 职场文书
趣味运动会赞词
2015/07/22 职场文书
婚礼迎宾词大全
2015/08/10 职场文书
Python 批量下载阴阳师网站壁纸
2021/05/19 Python
python绘制云雨图raincloud plot
2022/08/05 Python