简单谈谈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往windows中添加用户
Dec 06 PHP
php下使用SMTP发邮件的代码
Jan 10 PHP
php下通过伪造http头破解防盗链的代码
Jul 03 PHP
php中的Base62类(适用于数值转字符串)
Aug 12 PHP
ThinkPHP分组下自定义标签库实例
Nov 01 PHP
WordPress主题中添加文章列表页页码导航的PHP代码实例
Dec 22 PHP
php 常用的系统函数
Feb 07 PHP
PHP后端银联支付及退款实例代码
Jun 23 PHP
Eclipse PHPEclipse 配置的具体步骤
Aug 08 PHP
Laravel中批量赋值Mass-Assignment的真正含义详解
Sep 29 PHP
PHP实现的大文件切割与合并功能示例
Apr 10 PHP
深入浅析安装PhpStorm并激活的步骤详解
Sep 17 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面向对象之里氏替换原则简单示例
2018/04/08 PHP
jQuery 联动日历实现代码
2012/05/31 Javascript
javascript unicode与GBK2312(中文)编码转换方法
2013/11/14 Javascript
JavaScript函数作用域链分析
2015/02/13 Javascript
jQuery插件jquery-barcode实现条码打印的方法
2015/11/25 Javascript
实例讲解js验证表单项是否为空的方法
2016/01/09 Javascript
APP中javascript+css3实现下拉刷新效果
2016/01/27 Javascript
JavaScript中闭包的写法和作用详解
2016/06/29 Javascript
使用DeviceOne实现微信小程序功能
2016/12/29 Javascript
Vue使用vux-ui自定义表单验证遇到的问题及解决方法
2018/05/10 Javascript
解决vue动态为数据添加新属性遇到的问题
2018/09/18 Javascript
JS实现炫酷雪花飘落效果
2020/08/19 Javascript
js实现纯前端压缩图片
2020/11/16 Javascript
nodejs+express最简易的连接数据库的方法
2020/12/23 NodeJs
原生js拖拽功能制作滑动条实例代码
2021/02/05 Javascript
python3利用Dlib19.7实现人脸68个特征点标定
2018/02/26 Python
用python实现百度翻译的示例代码
2018/03/09 Python
Django中的文件的上传的几种方式
2018/07/23 Python
python机器学习包mlxtend的安装和配置详解
2019/08/21 Python
python 中不同包 类 方法 之间的调用详解
2020/03/09 Python
python selenium自动化测试框架搭建的方法步骤
2020/06/14 Python
CSS类名支持中文命名的示例
2014/04/04 HTML / CSS
CSS超出文本指定宽度用省略号代替和文本不换行
2016/05/05 HTML / CSS
Banana Republic英国官网:香蕉共和国,GAP集团旗下偏贵族风
2018/04/24 全球购物
Christys’ Hats官网:英国帽子制造商
2018/11/28 全球购物
光声世纪笔试题目
2012/08/25 面试题
Java面试题汇总
2015/12/06 面试题
说明书格式及范文
2014/05/07 职场文书
小学生志愿者活动方案
2014/08/23 职场文书
企业党的群众路线教育实践活动学习心得体会
2014/10/31 职场文书
党的群众路线教育实践活动个人对照检查材料(医生)
2014/11/05 职场文书
法定代表人证明书
2014/11/28 职场文书
2015年员工工作表现评语
2015/03/25 职场文书
2016年精神文明建设先进个人事迹材料
2016/02/29 职场文书
情况说明书格式及范文
2019/06/24 职场文书
一次SQL如何查重及去重的实战记录
2022/03/13 MySQL