深入理解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 相关文章推荐
用libTemplate实现静态网页的生成
Oct 09 PHP
PHP安全配置
Oct 09 PHP
不要轻信 PHP_SELF的安全问题
Sep 05 PHP
php addslashes及其他清除空格的方法是不安全的
Jan 25 PHP
用PHP读取超大文件的实例代码
Apr 01 PHP
MySQL 日期时间函数常用总结
Jun 12 PHP
解析php利用正则表达式解决采集内容排版的问题
Jun 20 PHP
php汉字转拼音的示例
Feb 27 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
Feb 15 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
Feb 08 PHP
在Yii2特定页面如何禁用调试工具栏Debug Toolbar详解
Aug 07 PHP
phpQuery解析HTML乱码问题(补充官网未列出的乱码解决方案)
Apr 01 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与已存在的Java应用程序集成
2006/10/09 PHP
php+mysql结合Ajax实现点赞功能完整实例
2015/01/30 PHP
深入理解PHP类的自动载入机制
2016/09/16 PHP
PHP设计模式之适配器模式原理与用法分析
2018/04/25 PHP
线路分流自动跳转代码;希望对大家有用!
2006/12/02 Javascript
得到文本框选中的文字,动态插入文字的js代码
2007/03/07 Javascript
精心挑选的12款优秀的基于jQuery的手风琴效果插件和教程
2012/08/22 Javascript
表单元素与非表单元素刷新区别详细解析
2013/11/06 Javascript
JS实现距离上次刷新已过多少秒示例
2014/05/23 Javascript
jQuery实现友好的轮播图片特效
2015/01/12 Javascript
js实现选中复选框文字变色的方法
2015/08/14 Javascript
JavaScript与HTML的结合方法详解
2015/11/23 Javascript
jquery实现下拉框多选方法介绍
2017/01/03 Javascript
vuex根据不同的用户权限展示不同的路由列表功能
2019/09/20 Javascript
微信小程序按顺序同步执行的两种方式
2019/12/20 Javascript
javascript设计模式 ? 简单工厂模式原理与应用实例分析
2020/04/09 Javascript
vue实现移动端触屏拖拽功能
2020/08/21 Javascript
JS前端基于canvas给图片添加水印
2020/11/11 Javascript
python两种遍历字典(dict)的方法比较
2014/05/29 Python
用Python实现一个简单的多线程TCP服务器的教程
2015/05/05 Python
Python分治法定义与应用实例详解
2017/07/28 Python
win10下安装Anaconda的教程(python环境+jupyter_notebook)
2019/10/23 Python
tensorflow 变长序列存储实例
2020/01/20 Python
python编写俄罗斯方块
2020/03/13 Python
Django+RestFramework API接口及接口文档并返回json数据操作
2020/07/12 Python
用CSS3实现无限循环的无缝滚动的实例代码
2017/07/04 HTML / CSS
StubHub智利:购买和出售您的门票
2016/11/23 全球购物
俄罗斯首家面向中国消费者的一站式购物网站:Wruru
2020/05/08 全球购物
毕业生自荐书模版
2014/01/04 职场文书
教师对学生的评语
2014/04/28 职场文书
大学生求职计划书
2014/04/30 职场文书
自愿解除劳动合同协议书
2014/09/11 职场文书
2014年乡镇妇联工作总结
2014/12/02 职场文书
请假条应该怎么写?
2019/06/24 职场文书
合同范本之电脑出租
2019/08/13 职场文书
python数据库批量插入数据的实现(executemany的使用)
2021/04/30 Python