深入理解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
PHP脚本的10个技巧(4)
Oct 09 PHP
PHP4 与 MySQL 数据库操作函数详解
Dec 06 PHP
也谈php网站在线人数统计
Apr 09 PHP
php 设计模式之 工厂模式
Dec 19 PHP
PHP通过header实现文本文件下载的代码
Aug 08 PHP
php中使用explode查找某个字符是否存在的方法
Jul 12 PHP
PHP中防止直接访问或查看或下载config.php文件的方法
Jul 07 PHP
PHP生成图片验证码、点击切换实例
Jun 25 PHP
smarty模板引擎从配置文件中获取数据的方法
Jan 22 PHP
php单链表实现代码分享
Jul 04 PHP
PHP xpath提取网页数据内容代码解析
Jul 16 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函数memory_get_usage获取PHP内存清耗量的方法
2011/12/06 PHP
PHP+MYSQL会员系统的开发实例教程
2014/08/23 PHP
PHP SPL标准库中的常用函数介绍
2015/05/11 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
PHP $O00OO0=urldecode &amp; eval 解密,记一次商业源码的去后门
2020/09/13 PHP
讲两件事:1.this指针的用法小探. 2.ie的attachEvent和firefox的addEventListener在事件处理上的区别
2007/04/12 Javascript
jQuery探测位置的提示弹窗(toolTip box)详细解析
2013/11/14 Javascript
在JavaScript中使用timer示例
2014/05/08 Javascript
JQuery性能优化的几点建议
2014/05/14 Javascript
javascript实现跨域的方法汇总
2015/06/25 Javascript
尝试动手制作javascript放大镜效果
2015/12/25 Javascript
妙用Bootstrap的 popover插件实现校验表单提示功能
2016/08/29 Javascript
javascript中的后退和刷新实现方法
2016/11/10 Javascript
ES6中Array.find()和findIndex()函数的用法详解
2017/09/16 Javascript
JS中图片压缩的方法小结
2017/11/14 Javascript
vue中$set的使用(结合在实际应用中遇到的坑)
2018/07/10 Javascript
Angular设置别名alias的方法
2018/11/08 Javascript
ES6 fetch函数与后台交互实现
2018/11/14 Javascript
Vue.js结合bootstrap前端实现分页和排序效果
2018/12/29 Javascript
JS使用H5实现图片预览功能
2019/09/30 Javascript
JavaScript实现点击出现子菜单效果
2021/02/08 Javascript
[09:34]2018DOTA2国际邀请赛寻真——永不放弃的iG
2018/08/14 DOTA
[46:59]完美世界DOTA2联赛PWL S2 GXR vs Ink 第二场 11.19
2020/11/20 DOTA
对Python3 pyc 文件的使用详解
2019/02/16 Python
django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】
2019/12/12 Python
linux 下selenium chrome使用详解
2020/04/02 Python
Python Django路径配置实现过程解析
2020/11/05 Python
CSS中垂直居中的简单实现方法
2015/07/06 HTML / CSS
HTML文本属性&amp;颜色控制属性的实现
2019/12/17 HTML / CSS
DBA数据库管理员JAVA程序员架构师必看
2016/02/07 面试题
财务人员的自我评价范文
2014/03/03 职场文书
应聘销售主管的求职信
2014/04/26 职场文书
会计学自荐信
2014/06/03 职场文书
会议简讯范文
2015/07/20 职场文书
解决hive中导入text文件遇到的坑
2021/04/07 Python
PHP 时间处理类Carbon
2022/05/20 PHP