简单谈谈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 已经成熟
Dec 04 PHP
php获取地址栏信息的代码
Oct 08 PHP
PHP数组操作汇总 php数组的使用技巧
Jul 17 PHP
php Smarty初体验二 获取配置信息
Aug 08 PHP
PHP5中实现多态的两种方法实例分享
Apr 21 PHP
PHP OPP机制和模式简介(抽象类、接口和契约式编程)
Jun 09 PHP
PHP简单生成缩略图相册的方法
Jul 29 PHP
ThinkPHP实现递归无级分类――代码少
Jul 29 PHP
PHP使用Pthread实现的多线程操作实例
Nov 14 PHP
magento后台无法登录解决办法的两种方法
Dec 09 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
Jul 26 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/04/23 PHP
form自动提交实例讲解
2017/07/10 PHP
在laravel中实现将查询的对象转换为多维数组的函数
2019/10/21 PHP
Laravel如何实现适合Api的异常处理响应格式
2020/06/14 PHP
Js+Flash实现访问剪切板操作
2012/11/20 Javascript
JQuery1.8 判断元素是否绑定事件的方法
2014/07/10 Javascript
详解AngularJS中自定义过滤器
2015/12/28 Javascript
你一定会收藏的Nodejs代码片段
2016/02/04 NodeJs
JS实现列表的响应式排版(推荐)
2016/09/01 Javascript
jquery.tableSort.js表格排序插件使用方法详解
2020/08/12 Javascript
Node.js使用NodeMailer发送邮件实例代码
2017/03/06 Javascript
nodejs构建本地web测试服务器 如何解决访问静态资源问题
2017/07/14 NodeJs
详解React Native网络请求fetch简单封装
2017/08/10 Javascript
浅谈Vue.nextTick 的实现方法
2017/10/25 Javascript
使用vue2实现购物车和地址选配功能
2018/03/29 Javascript
Vue实现按钮旋转和移动位置的实例代码
2018/08/09 Javascript
vue使用ajax获取后台数据进行显示的示例
2018/08/09 Javascript
vue watch深度监听对象实现数据联动效果
2018/08/16 Javascript
详解如何webpack使用DllPlugin
2018/09/30 Javascript
详解从react转职到vue开发的项目准备
2019/01/14 Javascript
详解VUE单页应用骨架屏方案
2019/01/17 Javascript
Node.js 进程平滑离场剖析小结
2019/01/24 Javascript
nodejs开发一个最简单的web服务器实例讲解
2020/01/02 NodeJs
原生js canvas实现鼠标跟随效果
2020/08/02 Javascript
nestjs返回给前端数据格式的封装实现
2021/02/22 Javascript
Python对字符串实现去重操作的方法示例
2017/08/11 Python
Python利用splinter实现浏览器自动化操作方法
2018/05/11 Python
python sys.argv[]用法实例详解
2018/05/25 Python
用Python获取摄像头并实时控制人脸的实现示例
2019/07/11 Python
python实现提取str字符串/json中多级目录下的某个值
2020/02/27 Python
Python如何存储数据到json文件
2020/03/09 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
2020/08/18 Python
小米官方旗舰店:Xiaomi
2020/08/07 全球购物
大学毕业感言
2014/01/10 职场文书
2014年维修工作总结
2014/11/22 职场文书
python 判断文件或文件夹是否存在
2022/03/18 Python