深入理解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 相关文章推荐
一个高ai的分页函数和一个url函数
Oct 09 PHP
一个ubbcode的函数,速度很快.
Oct 09 PHP
mysql5写入和读出乱码解决
Nov 25 PHP
Zend Studio for Eclipse的java.lang.NullPointerException错误的解决方法
Dec 06 PHP
php 修改zen-cart下单和付款流程以防止漏单
Mar 08 PHP
PHP的cURL库功能简介 抓取网页、POST数据及其他
Apr 07 PHP
Win7 64位系统下PHP连接Oracle数据库
Aug 20 PHP
浅谈PHP中JSON数据操作
Jul 01 PHP
使用PHP编写发红包程序
Jul 22 PHP
Yii基于CActiveForm的Ajax数据验证用法示例
Jul 14 PHP
PHP实现的随机红包算法示例
Aug 14 PHP
关于laravel-admin ueditor 集成并解决刷新的问题
Oct 21 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/03 咖啡文化
php中的boolean(布尔)类型详解
2013/10/28 PHP
PHP的文件操作与算法实现的面试题示例
2015/08/10 PHP
php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程
2020/08/17 PHP
判断页面是关闭还是刷新的js代码
2007/01/28 Javascript
Ext javascript建立超链接,进行事件处理的实现方法
2009/03/22 Javascript
javascript验证上传文件的类型限制必须为某些格式
2013/11/14 Javascript
JavaScript参数个数可变的函数举例说明
2014/10/10 Javascript
jQuery判断对象是否存在的方法
2015/02/05 Javascript
JavaScript 实现的 zip 压缩和解压缩工具包Zip.js使用详解
2015/12/14 Javascript
jquery实现右侧栏菜单选择操作
2016/03/04 Javascript
Angularjs实现带查找筛选功能的select下拉框示例代码
2016/10/04 Javascript
jQuery实现ToolTip元素定位显示功能示例
2016/11/23 Javascript
bootstrap动态调用select下拉框的实例代码
2018/08/09 Javascript
jQuery内容过滤选择器与子元素过滤选择器用法实例分析
2019/02/20 jQuery
JavaScript 类的封装操作示例详解
2020/05/16 Javascript
Python实现多线程下载文件的代码实例
2014/06/01 Python
让python在hadoop上跑起来
2016/01/27 Python
python 通过字符串调用对象属性或方法的实例讲解
2018/04/21 Python
Django项目实战之用户头像上传与访问的示例
2018/04/21 Python
python3读取excel文件只提取某些行某些列的值方法
2018/07/10 Python
python except异常处理之后不退出,解决异常继续执行的实现
2020/04/25 Python
css3发光搜索表单分享
2014/04/11 HTML / CSS
马来西亚与新加坡长途巴士售票网站:BusOnlineTicket.com
2018/11/05 全球购物
美国最大的购物网站:Amazon.com(亚马逊美国)
2020/05/23 全球购物
Discard Protocol抛弃协议的作用是什么
2015/10/10 面试题
大学生创业计划书的格式要求
2013/12/29 职场文书
公司司机岗位职责
2014/02/07 职场文书
婚礼主持词
2014/03/13 职场文书
2014员工聘用协议书(最新版)
2014/11/24 职场文书
2014社会治安综合治理工作总结
2014/12/04 职场文书
中层干部考核评语
2015/01/04 职场文书
邀请函怎么写
2015/01/30 职场文书
小型婚礼主持词
2015/06/30 职场文书
创业计划书之淘宝网店
2019/10/08 职场文书
SQL Server作业失败:无法确定所有者是否有服务器访问权限的解决方法
2021/06/30 SQL Server