简单谈谈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 深入理解strtotime函数的使用详解
May 23 PHP
一个简单的php加密解密函数(动态加密)
Jun 19 PHP
php一次性删除前台checkbox多选内容的方法
Sep 22 PHP
ThinkPHP的L方法使用简介
Jun 18 PHP
CodeIgniter框架URL路由总结
Sep 03 PHP
详解PHP的Yii框架中的Controller控制器
Mar 29 PHP
PHP获取文件扩展名的方法实例总结
Jun 10 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
Dec 25 PHP
thinkphp5 加载静态资源路径与常量的方法
Dec 24 PHP
PHP各种常见经典算法总结【排序、查找、翻转等】
Aug 05 PHP
php+layui数据表格实现数据分页渲染代码
Oct 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
Smarty缓存机制实例详解【三种缓存方式】
2019/07/20 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
JavaScript 应用类库代码
2008/06/02 Javascript
Jquery 获得服务器控件值的方法小结
2010/05/11 Javascript
jQuery 源码分析笔记(3) Deferred机制
2011/06/19 Javascript
Prototype源码浅析 Number部分
2012/01/16 Javascript
关于IE中getElementsByClassName不能用的问题解决方法
2013/08/26 Javascript
javascript搜索框点击文字消失失焦时文本出现
2014/09/18 Javascript
Javascript基础教程之变量
2015/01/18 Javascript
js的for in循环和java里foreach循环的区别分析
2015/01/28 Javascript
JSON字符串转换JSONObject和JSONArray的方法
2016/06/03 Javascript
微信小程序实现锚点定位楼层跳跃的实例
2017/05/18 Javascript
基于vue实现swipe轮播组件实例代码
2017/05/24 Javascript
微信小程序使用GoEasy实现websocket实时通讯
2020/05/19 Javascript
vue 根据选择的月份动态展示日期对应的星期几
2021/02/06 Vue.js
使用httplib模块来制作Python下HTTP客户端的方法
2015/06/19 Python
浅谈python迭代器
2017/11/08 Python
Python数据结构与算法之使用队列解决小猫钓鱼问题
2017/12/14 Python
TensorFlow实现RNN循环神经网络
2018/02/28 Python
python binascii 进制转换实例
2019/06/12 Python
python实现最大子序和(分治+动态规划)
2019/07/05 Python
对Python生成器、装饰器、递归的使用详解
2019/07/19 Python
Python 迭代,for...in遍历,迭代原理与应用示例
2019/10/12 Python
Python的几种主动结束程序方式
2019/11/22 Python
python wxpython 实现界面跳转功能
2019/12/17 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
2020/02/25 Python
基于python实现破解滑动验证码过程解析
2020/05/28 Python
python Matplotlib数据可视化(2):详解三大容器对象与常用设置
2020/09/30 Python
static关键字的用法
2013/10/07 面试题
电子商务专员岗位职责
2013/12/11 职场文书
个人党性剖析材料
2014/02/03 职场文书
根叔历年演讲稿
2014/05/20 职场文书
农业项目建议书
2014/08/25 职场文书
正风肃纪剖析材料
2014/09/30 职场文书
销售区域经理岗位职责
2015/04/10 职场文书
幼儿园庆六一主持词
2015/06/30 职场文书