简单谈谈php中ob_flush和flush的区别


Posted in PHP onNovember 27, 2014

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也可以, 只不过为了保证你代码的可移植性, 建议配套使用.

flush和ob_flush的使用上有一些特别注意的地方,造成无法刷新输出缓冲。

一. flush和ob_flush的正确顺序,先ob_flush再flush,如下:
ob_flush();
flush();
如果Web服务器的操作系统是windows系统,那顺序颠倒或者不使用ob_flush()也不会出现问题。但是在Linux系统上就无法刷新输出缓冲。

二. 使用ob_flush()前,确保前面的内容大小足够4069字符

一些Web服务器的output_buffering默认是4069字符或者更大,即输出内容必须达到4069字符服务器才会flush刷新输出缓冲,为了确保flush有效,最好在ob_flush()函数前有以下语句:
print str_repeat(" ", 4096);
以确保到达output_buffering值。

<?php

for ($i=1; $i<20; $i++)

{

echo "<font size='10' color='red'>".$i."</font>";

echo '<br>';

ob_flush();

flush();

sleep(1);

}

ob_end_flush();

?>
PHP 相关文章推荐
php模板之Phpbean的目录结构
Jan 10 PHP
PHP setTime 设置当前时间的代码
Aug 27 PHP
基于PHP Web开发MVC框架的Smarty使用说明
Apr 19 PHP
PHP英文字母大小写转换函数小结
May 03 PHP
php结合md5实现的加密解密方法
Jan 25 PHP
Yii视图CGridView实现操作按钮定义地址示例
Jul 14 PHP
php+redis实现多台服务器内网存储session并读取示例
Jan 12 PHP
yii2使用gridView实现下拉列表筛选数据
Apr 10 PHP
PHP简单装饰器模式实现与用法示例
Jun 22 PHP
PHP工厂模式的日常使用
Mar 20 PHP
PHP保存Base64图片base64_decode的问题整理
Nov 04 PHP
php操作redis命令及代码实例大全
Nov 19 PHP
浅谈php优化需要注意的地方
Nov 27 #PHP
PHP实现文件下载详解
Nov 27 #PHP
thinkphp的URL路由规则与配置实例
Nov 26 #PHP
thinkphp文件引用与分支结构用法实例
Nov 26 #PHP
PHP获取当前所在目录位置的方法
Nov 26 #PHP
thinkphp模板的包含与渲染实例分析
Nov 26 #PHP
PHP中strtr字符串替换用法详解
Nov 26 #PHP
You might like
深入探讨PHP中的内存管理问题
2011/08/31 PHP
ThinkPHP模板引擎之导入资源文件方法详解
2014/06/18 PHP
深入分析PHP引用(&amp;)
2014/09/04 PHP
PHP滚动日志的代码实现
2015/06/10 PHP
PHP中array_keys和array_unique函数源码的分析
2016/02/26 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
2016/09/11 PHP
用一段js程序来实现动画功能
2007/03/06 Javascript
javascript 读取图片文件的大小
2009/06/25 Javascript
javascript encodeURI和encodeURIComponent的比较
2010/04/03 Javascript
JavaScript中的分号插入机制详细介绍
2015/02/11 Javascript
浅谈JavaScript 浏览器对象
2016/06/03 Javascript
轻松实现js弹框显示选项
2016/09/13 Javascript
JavaScript fetch接口案例解析
2018/08/30 Javascript
浅谈webpack devtool里的7种SourceMap模式
2019/01/14 Javascript
vue+iview/elementUi实现城市多选
2019/03/28 Javascript
使用vuex解决刷新页面state数据消失的问题记录
2019/05/08 Javascript
JS实现放烟花效果
2020/03/10 Javascript
微信小程序吸底区域适配iPhoneX的实现
2020/04/09 Javascript
JS面试题中深拷贝的实现讲解
2020/05/07 Javascript
Javascript前端下载后台传来的文件流代码实例
2020/08/18 Javascript
Python实现list反转实例汇总
2014/11/11 Python
基于Django模板中的数字自增(详解)
2017/09/05 Python
Python3利用Dlib19.7实现摄像头人脸识别的方法
2018/05/11 Python
详解python读取image
2019/04/03 Python
Python3分析处理声音数据的例子
2019/08/27 Python
Python threading的使用方法解析
2019/08/28 Python
Python print不能立即打印的解决方式
2020/02/19 Python
美国在线纱线商店:Darn Good Yarn
2019/03/20 全球购物
工商管理实习自我鉴定
2013/09/28 职场文书
公司总经理岗位职责
2014/03/15 职场文书
钱学森电影观后感
2015/06/04 职场文书
社区志愿服务活动感想
2015/08/07 职场文书
《山中访友》教学反思
2016/02/24 职场文书
C#连接ORACLE出现乱码问题的解决方法
2021/10/05 Oracle
JAVA 线程池(池化技术)的实现原理
2022/04/28 Java/Android
Python中requests库的用法详解
2022/06/05 Python