简单谈谈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的FTP学习(四)
Oct 09 PHP
很实用的一个完整email发送程序
Oct 09 PHP
比较简单实用的PHP无限分类源码分享(思路不错)
Oct 13 PHP
PHP内核探索:变量存储与类型使用说明
Jan 30 PHP
一个完整的PHP类包含的七种语法说明
Jun 04 PHP
PHP代码实现爬虫记录――超管用
Jul 31 PHP
PHP接收json 并将接收数据插入数据库的实现代码
Dec 01 PHP
php实现生成验证码实例分享
Apr 10 PHP
php使用Jpgraph创建折线图效果示例
Feb 15 PHP
Laravel模型间关系设置分表的方法示例
Apr 21 PHP
PHP学习记录之常用的魔术常量详解
Dec 12 PHP
WordPress免插件实现面包屑导航的示例代码
Aug 20 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
实例(Smarty+FCKeditor新闻系统)
2007/01/02 PHP
php和editplus正则表达式去除空白行
2015/04/17 PHP
PHP中file_get_contents函数抓取https地址出错的解决方法(两种方法)
2015/09/22 PHP
Yii的Srbac插件用法详解
2016/07/14 PHP
PHP用户管理中常用接口调用实例及解析(含源码)
2017/03/09 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
可以支持多中格式的JS键盘
2007/05/02 Javascript
深入理解JavaScript系列(27):设计模式之建造者模式详解
2015/03/03 Javascript
jQuery入门之层次选择器实例简析
2015/12/11 Javascript
JS组件Bootstrap Select2使用方法解析
2016/05/30 Javascript
Bootstrap风格的WPF样式
2016/12/07 Javascript
基于node下的http小爬虫的示例代码
2018/01/11 Javascript
Nuxt.js实战详解
2018/01/18 Javascript
浅谈微信页面入口文件被缓存解决方案
2018/09/29 Javascript
Node+OCR实现图像文字识别功能
2018/11/26 Javascript
JS使用setInterval计时器实现挑战10秒
2020/11/08 Javascript
微信小程序实现音乐播放页面布局
2020/12/11 Javascript
python中的字典使用分享
2016/07/31 Python
Python爬虫中urllib库的进阶学习
2018/01/05 Python
django连接mysql配置方法总结(推荐)
2018/08/18 Python
Python 限制线程的最大数量的方法(Semaphore)
2019/02/22 Python
用python给自己做一款小说阅读器过程详解
2019/07/11 Python
python对Excel的读取的示例代码
2020/02/14 Python
用Python绘制漫步图实例讲解
2020/02/26 Python
Python ArgumentParse的subparser用法说明
2020/04/20 Python
浅谈Python协程
2020/06/17 Python
解决pytorch 的state_dict()拷贝问题
2021/03/03 Python
西班牙英格列斯百货官网:El Corte Inglés
2016/09/25 全球购物
公司市场部岗位职责
2013/12/02 职场文书
公司保密承诺书
2014/03/27 职场文书
物业管理委托协议(2篇)
2014/09/23 职场文书
2015新年联欢晚会开场白
2014/12/14 职场文书
2015年学校教育教学工作总结
2015/04/22 职场文书
2015年小学师德师风建设工作总结
2015/10/23 职场文书
幼儿园2016年感恩节活动总结
2016/04/01 职场文书
Python排序算法之插入排序及其优化方案详解
2021/06/11 Python