简单谈谈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生成带有雪花背景的验证码
Oct 09 PHP
PHP XML error parsing SOAP payload on line 1
Jun 17 PHP
用PHP+MySQL搭建聊天室功能实例代码
Aug 20 PHP
php中hashtable实现示例分享
Feb 13 PHP
PHP面向对象程序设计之类常量用法实例
Aug 20 PHP
PHP中soap的用法实例
Oct 24 PHP
PHP解析目录路径的3个函数总结
Nov 18 PHP
php获取本周开始日期和结束日期的方法
Mar 09 PHP
PHP中call_user_func_array回调函数的用法示例
Nov 26 PHP
php curl上传、下载、https登陆实现代码
Jul 23 PHP
CI框架简单分页类用法示例
Jun 06 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
Mar 09 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
PHP5中的this,self和parent关键字详解教程
2007/03/19 PHP
提示Trying to clone an uncloneable object of class Imagic的解决
2011/10/27 PHP
探讨php define()函数及defined()函数使用详解
2013/06/09 PHP
PHP实现移除数组中为空或为某值元素的方法
2017/01/07 PHP
php实现的rc4加密解密类定义与用法示例
2018/08/16 PHP
PHP htmlentities()函数用法讲解
2019/02/25 PHP
超棒的javascript页面顶部卷动广告效果
2007/12/01 Javascript
使用基于jquery的gamequery插件做JS乒乓球游戏
2011/07/31 Javascript
js 手机号码合法性验证代码集合
2012/09/29 Javascript
js获取class的所有元素
2013/03/28 Javascript
javascript中的throttle和debounce浅析
2014/06/06 Javascript
jQuery常用数据处理方法小结
2015/02/20 Javascript
jQuery密码强度检测插件passwordStrength用法实例分析
2015/10/30 Javascript
JS实现网页标题栏显示当前时间和日期的完整代码
2015/11/02 Javascript
分享几种比较简单实用的JavaScript tabel切换
2015/12/31 Javascript
jQuery判断邮箱格式对错实例代码讲解
2017/04/12 jQuery
详解ES6中的Map与Set集合
2019/03/22 Javascript
js神秘的电报密码 哈弗曼编码实现
2019/09/10 Javascript
浅谈vue中组件绑定事件时是否加.native
2019/11/09 Javascript
vue通过接口直接下载java生成好的Excel表格案例
2020/10/26 Javascript
[02:40]DOTA2超级联赛专访430 从小就爱玩对抗性游戏
2013/06/18 DOTA
pycharm 使用心得(六)进行简单的数据库管理
2014/06/06 Python
简析Python的闭包和装饰器
2016/02/26 Python
Python之inspect模块实现获取加载模块路径的方法
2018/10/16 Python
opencv实现静态手势识别 opencv实现剪刀石头布游戏
2019/01/22 Python
Python flask框架post接口调用示例
2019/07/03 Python
Python 类的私有属性和私有方法实例分析
2019/09/29 Python
英国最大的滑板品牌选择:Route One
2019/09/22 全球购物
安全生产投入制度
2014/01/29 职场文书
银行工作检查书范文
2014/01/31 职场文书
我的求职择业计划书
2014/04/04 职场文书
推荐信格式要求
2014/05/09 职场文书
乡镇党员干部群众路线对照检查材料思想汇报
2014/09/28 职场文书
导盲犬小Q观后感
2015/06/11 职场文书
中国式结婚:司仪主持词(范文)
2019/07/25 职场文书
关于redisson缓存序列化几枚大坑说明
2021/08/04 Redis