简单谈谈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 相关文章推荐
利用递归把多维数组转为一维数组的函数
Oct 09 PHP
php adodb连接mssql解决乱码问题
Jun 12 PHP
PHP生成二维码的两个方法和实例
Jul 01 PHP
php中Y2K38的漏洞解决方法实例分析
Sep 22 PHP
php中debug_backtrace、debug_print_backtrace和匿名函数用法实例
Dec 01 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
Oct 01 PHP
PHP编写RESTful接口的方法
Feb 21 PHP
[原创]php实现子字符串位置相互对调互换的方法
Jun 02 PHP
Yii2选项卡的简单使用
May 26 PHP
php实现构建排除当前元素的乘积数组方法
Oct 06 PHP
PHP PDOStatement::bindParam讲解
Jan 30 PHP
Laravel如何同时连接多个数据库详解
Aug 13 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
基于Linux调试工具strace与gdb的常用命令总结
2013/06/03 PHP
常用PHP框架功能对照表
2014/10/23 PHP
thinkphp实现上一篇与下一篇的方法
2014/12/08 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
php xhprof使用实例详解
2019/04/15 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
jquery 常用操作整理 基础入门篇
2009/10/14 Javascript
JS中实现replaceAll的方法(实例代码)
2013/11/12 Javascript
基于socket.io和node.js搭建即时通信系统
2014/07/30 Javascript
jquery uploadify隐藏上传进度的实现方法
2017/02/06 Javascript
详解NodeJS框架express的路径映射(路由)功能及控制
2017/03/24 NodeJs
详解cordova打包成webapp的方法
2017/10/18 Javascript
Angular搜索场景中使用rxjs的操作符处理思路
2018/05/30 Javascript
ES6 系列之 WeakMap的使用示例
2018/08/06 Javascript
jQuery.validate.js表单验证插件的使用代码详解
2018/10/22 jQuery
Nodejs中使用puppeteer控制浏览器中视频播放功能
2019/08/26 NodeJs
[52:05]EG vs OG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
利用Python的装饰器解决Bottle框架中用户验证问题
2015/04/24 Python
python3批量删除豆瓣分组下的好友的实现代码
2016/06/07 Python
利用Python如何实现一个小说网站雏形
2018/11/23 Python
python中对_init_的理解及实例解析
2019/10/11 Python
tensorflow实现将ckpt转pb文件的方法
2020/04/22 Python
用python对oracle进行简单性能测试
2020/12/05 Python
STAY JAPAN台湾:预订日本民宿
2018/07/22 全球购物
莱德杯高尔夫欧洲官方商店:Ryder Cup Shop
2019/08/14 全球购物
财务管理专业毕业生求职信范文
2013/09/21 职场文书
出国考察邀请函
2014/01/21 职场文书
打架检讨书500字
2014/01/29 职场文书
大学生活自我评价
2014/04/09 职场文书
婚前保证书
2014/04/29 职场文书
求职信标题怎么写
2014/05/26 职场文书
安全施工标语
2014/06/07 职场文书
上海世博会志愿者口号
2014/06/17 职场文书
防火标语大全
2014/10/06 职场文书
地道战观后感300字
2015/06/04 职场文书
导游词之镜泊湖
2019/12/09 职场文书