深入理解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中实现图片的锐化
Oct 09 PHP
Http 1.1 Etag 与 Last-Modified提高php效率
Jan 10 PHP
Notice: Undefined index: page in E:\PHP\test.php on line 14
Nov 02 PHP
基于PHP常用字符串的总结(待续)
Jun 07 PHP
php_screw安装使用教程(另一个PHP代码加密实现)
May 29 PHP
浅析PHP中call user func()函数及如何使用call user func调用自定义函数
Nov 05 PHP
PHP编写文件多服务器同步程序
Jul 02 PHP
PHP实现的策略模式简单示例
Aug 25 PHP
PHP文件上传小程序 适合初学者学习!
May 23 PHP
php获取微信openid方法总结
Oct 10 PHP
PHP实现笛卡尔积算法的实例讲解
Dec 22 PHP
php变量与字符串的增删改查操作示例
May 07 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
咖啡店都有些什么常规豆子呢?有什么风味在里面
2021/03/04 咖啡文化
据说是雅虎的一份PHP面试题附答案
2009/01/07 PHP
php for 循环语句使用方法详细说明
2010/05/09 PHP
php环境无法上传文件的解决方法
2014/04/30 PHP
简单的php+mysql聊天室实现方法(附源码)
2016/01/05 PHP
PHP实现动态删除XML数据的方法示例
2018/03/30 PHP
PHPStudy下如何为Apache安装SSL证书的方法步骤
2019/01/23 PHP
Laravel实现通过blade模板引擎渲染视图
2019/10/25 PHP
通过jQuery打造支持汉字,拼音,英文快速定位查询的超级select插件
2010/06/18 Javascript
基于JQuery的asp.net树实现代码
2010/11/30 Javascript
jquery uaMatch源代码
2011/02/14 Javascript
jquery()函数的三种语法介绍
2013/10/09 Javascript
JQuery的$和其它JS发生冲突的快速解决方法
2014/01/24 Javascript
js中直接声明一个对象的方法
2014/08/10 Javascript
通过构造函数实例化对象的方法
2017/06/28 Javascript
详谈JS中数组的迭代方法和归并方法
2017/08/11 Javascript
AngularJS 实现购物车全选反选功能
2017/10/24 Javascript
vue根据进入的路由进行原路返回的方法
2018/09/26 Javascript
[01:24:16]2018DOTA2亚洲邀请赛 4.6 全明星赛
2018/04/10 DOTA
[53:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第一场 1月31日
2021/03/11 DOTA
Python使用爬虫猜密码
2016/02/19 Python
python正则中最短匹配实现代码
2018/01/16 Python
python 异或加密字符串的实例
2018/10/14 Python
Python读取配置文件(config.ini)以及写入配置文件
2020/04/08 Python
Python实现将元组中的元素作为参数传入函数的操作
2020/06/05 Python
阿联酋航空官方网站:Emirates
2017/10/17 全球购物
什么是Remote Module
2016/06/10 面试题
高中生家长会演讲稿
2014/01/14 职场文书
大四学生找工作的自荐信
2014/03/27 职场文书
党的生日活动方案
2014/08/15 职场文书
我的长征观后感
2015/06/09 职场文书
springboot项目以jar包运行的操作方法
2021/06/30 Java/Android
html5调用摄像头截图功能
2022/01/18 Javascript
Win11更新失败并提示0xc1900101
2022/04/19 数码科技
Golang入门之计时器
2022/05/04 Golang
Spring Cloud OpenFeign模版化客户端
2022/06/25 Java/Android