深入理解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
超强分页类2.0发布,支持自定义风格,默认4种显示模式
Jan 02 PHP
Dedecms V3.1 生成HTML速度的优化办法
Mar 18 PHP
PHP下10件你也许并不了解的事情
Sep 11 PHP
PHPMailer安装方法及简单实例
Nov 25 PHP
成为好程序员必须避免的5个坏习惯
Jul 04 PHP
两个php日期控制类实例
Dec 09 PHP
PHP封装的Twitter访问类实例
Jul 18 PHP
php车辆违章查询数据示例
Oct 14 PHP
PHP连接MySQL进行增、删、改、查操作
Feb 19 PHP
laravel中的一些简单实用功能
Nov 03 PHP
PHP封装的简单连接MongoDB类示例
Feb 13 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的字符串中单引号与双引号的区别
2016/05/07 PHP
Thinkphp5.0自动生成模块及目录的方法详解
2017/04/17 PHP
thinkPHP5框架闭包函数与子查询传参用法示例
2018/08/02 PHP
网页设计常用的一些技巧
2006/12/22 Javascript
判断输入是否为空,获得输入类型的JS代码
2013/10/30 Javascript
JS实现兼容性较好的随屏滚动效果
2015/11/09 Javascript
javascript多物体运动实现方法分析
2016/01/08 Javascript
JS中判断字符串中出现次数最多的字符及出现的次数的简单实例
2016/06/03 Javascript
Ionic如何实现下拉刷新与上拉加载功能
2016/06/03 Javascript
详解nodejs 文本操作模块-fs模块(一)
2016/12/22 NodeJs
深入理解在JS中通过四种设置事件处理程序的方法
2017/03/02 Javascript
整理关于Bootstrap排版的慕课笔记
2017/03/29 Javascript
JavaScript实现全选取消效果
2017/12/14 Javascript
10行代码实现微信小程序滑动tab切换
2018/12/28 Javascript
mocha的时序规则讲解
2019/02/16 Javascript
VUE搭建手机商城心得和遇到的坑
2019/02/21 Javascript
详解JavaScript作用域和作用域链
2019/03/19 Javascript
ES6 Iterator遍历器原理,应用场景及相关常用知识拓展详解
2020/02/15 Javascript
解决ant-design-vue中menu菜单无法默认展开的问题
2020/10/31 Javascript
[01:59][TI9趣味视频] 全明星赛奖励
2019/08/23 DOTA
利用QT写一个极简单的图形化Python闹钟程序
2015/04/07 Python
Python中pygame安装方法图文详解
2015/11/11 Python
快速入手Python字符编码
2016/08/03 Python
Python编程之序列操作实例详解
2017/07/22 Python
详解利用django中间件django.middleware.csrf.CsrfViewMiddleware防止csrf攻击
2018/10/09 Python
python flask框架实现重定向功能示例
2019/07/02 Python
Python 的 f-string 可以连接字符串与数字的原因解析
2021/02/20 Python
日本快乐生活方式购物网站:Shop Japan
2018/07/17 全球购物
美国基督教约会网站:ChristianCafe.com
2020/02/04 全球购物
全球精选男装和家居用品:Article
2020/04/13 全球购物
写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
2015/11/18 面试题
高中地理教学反思
2016/02/19 职场文书
教你使用pyinstaller打包Python教程
2021/05/27 Python
MySQL5.7并行复制原理及实现
2021/06/03 MySQL
MySQL 分区表中分区键为什么必须是主键的一部分
2022/03/17 MySQL
AndroidStudio图片压缩工具ImgCompressPlugin使用实例
2022/08/05 Java/Android