深入理解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 相关文章推荐
PHP 多维数组排序实现代码
Aug 05 PHP
采集邮箱的php代码(抓取网页中的邮箱地址)
Jul 17 PHP
服务器变量 $_SERVER 的深入解析
Jul 02 PHP
PHP中将ip地址转成十进制数的两种实用方法
Aug 15 PHP
PHP读取RSS(Feed)简单实例
Jun 12 PHP
五款PHP代码重构工具推荐
Oct 14 PHP
javascript数组与php数组的地址传递及值传递用法实例
Jan 22 PHP
php header函数的常用http头设置
Jun 25 PHP
简介PHP的Yii框架中缓存的一些高级用法
Mar 29 PHP
php性能分析之php-fpm慢执行日志slow log用法浅析
Oct 17 PHP
laravel ORM关联关系中的 with和whereHas用法
Oct 16 PHP
PHP获取学生成绩的方法
Nov 17 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
php中使用Akismet防止垃圾评论的代码
2011/06/10 PHP
一个可以兼容IE FF的加为首页与加入收藏实现代码
2009/11/02 Javascript
不同浏览器对回车提交表单的处理办法
2010/02/13 Javascript
jQuery编辑器KindEditor4.1.4代码高亮显示设置教程
2013/03/01 Javascript
Jquery实现点击切换图片并隐藏显示内容(2种方法实现)
2013/04/11 Javascript
Javascript字符串对象的常用方法简明版
2014/06/26 Javascript
JavaScript中的索引数组、关联数组和静态数组、动态数组讲解
2014/11/08 Javascript
jquery实现textarea输入框限制字数的方法
2015/01/15 Javascript
详谈javascript中DOM的基本属性
2015/02/26 Javascript
JS返回iframe中frameBorder属性值的方法
2015/04/01 Javascript
将页面table内容与样式另存成excel文件的方法
2015/08/05 Javascript
关于javascript中限定时间内防止按钮重复点击的思路详解
2016/08/16 Javascript
javascript另类方法实现htmlencode()与htmldecode()函数实例分析
2016/11/17 Javascript
百度地图JavascriptApi Marker平滑移动及车头指向行径方向
2017/03/13 Javascript
浅谈js-FCC算法Friendly Date Ranges(详解)
2017/04/10 Javascript
详解Vuex管理登录状态
2017/11/13 Javascript
webpack4 入门最简单的例子介绍
2018/09/05 Javascript
Vue防止白屏添加首屏动画的实例
2019/10/31 Javascript
解决VUE-Router 同一页面第二次进入不刷新的问题
2020/07/22 Javascript
Vue组件生命周期运行原理解析
2020/11/25 Vue.js
Python获取SQLite查询结果表列名的方法
2017/06/21 Python
详解Python异常处理中的Finally else的功能
2017/12/29 Python
django2 快速安装指南分享
2018/01/05 Python
Python线程同步的实现代码
2018/10/03 Python
自定义django admin model表单提交的例子
2019/08/23 Python
python的命名规则知识点总结
2019/10/04 Python
如何解决django-celery启动后迅速关闭
2019/10/16 Python
wxPython修改文本框颜色过程解析
2020/02/14 Python
Python3.7 读取音频根据文件名生成脚本的代码
2020/04/07 Python
python爬虫scrapy框架之增量式爬虫的示例代码
2021/02/26 Python
ECCO英国官网:丹麦鞋履品牌
2019/09/03 全球购物
中专三年学习的个人自我评价
2013/12/12 职场文书
开展党的群众路线教育实践活动方案
2014/02/05 职场文书
英语求职信范文
2014/05/23 职场文书
2016大学生社会实践心得体会范文
2016/01/14 职场文书
Oracle数据库中通用的函数实例详解
2022/03/25 Oracle