简单谈谈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+SQL 注入攻击的技术实现以及预防办法
Dec 29 PHP
header导出Excel应用示例
Jan 24 PHP
php对称加密算法示例
May 07 PHP
ThinkPHP实现事务回滚示例代码
Jun 23 PHP
php使用for语句输出三角形的方法
Jun 09 PHP
thinkphp中字符截取函数msubstr()用法分析
Jan 09 PHP
PHP list() 将数组中的值赋给变量的简单实例
Jun 13 PHP
Netbeans 8.2与PHP相关的新特性介绍
Oct 08 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
Nov 14 PHP
laravel 配置路由 api和web定义的路由的区别详解
Sep 03 PHP
Laravel自动生成UUID,从建表到使用详解
Oct 24 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 数组的合并、拆分、区别取值函数集
2010/02/15 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
2016/06/13 PHP
PHP ADODB生成HTML表格函数rs2html功能【附错误处理函数用法】
2018/05/29 PHP
javascript GUID生成器实现代码
2009/10/31 Javascript
jquery 笔记 事件
2011/11/02 Javascript
jQuery实现鼠标经过时出现隐藏层文字链接的方法
2015/10/12 Javascript
学习JavaScript事件流和事件处理程序
2016/01/25 Javascript
关于function类中定义变量this的简单说明
2016/05/28 Javascript
利用Javascript仿Excel的数据透视分析功能
2016/09/07 Javascript
js实现年月日表单三级联动
2020/04/17 Javascript
微信小程序图片宽100%显示并且不变形
2017/06/21 Javascript
JS滚动到指定位置导航栏固定顶部
2017/07/03 Javascript
vue不通过路由直接获取url中参数的方法示例
2017/08/24 Javascript
js实现有趣的倒计时效果
2021/01/19 Javascript
[02:51]2014DOTA2国际邀请赛 IG战队官方纪录片
2014/07/21 DOTA
Python中的XML库4Suite Server的介绍
2015/04/14 Python
Python正则表达式分组概念与用法详解
2017/06/24 Python
python 数据的清理行为实例详解
2017/07/12 Python
django admin添加数据自动记录user到表中的实现方法
2018/01/05 Python
磁盘垃圾文件清理器python代码实现
2020/08/24 Python
Python JSON格式数据的提取和保存的实现
2019/03/22 Python
如何分离django中的媒体、静态文件和网页
2019/11/12 Python
Tensorflow中tf.ConfigProto()的用法详解
2020/02/06 Python
Django添加bootstrap框架时无法加载静态文件的解决方式
2020/03/27 Python
整理HTML5移动端开发的常用触摸事件
2016/04/15 HTML / CSS
SmartBuyGlasses台湾:名牌眼镜,名牌太阳眼镜及隐形眼镜
2017/01/04 全球购物
goodhealth官方海外旗舰店:新西兰国民营养师
2017/12/15 全球购物
Bibloo奥地利:购买女装、男装、童装、鞋和配件
2018/10/18 全球购物
西班牙用户之间买卖视频游戏的平台:Wakkap
2020/03/21 全球购物
几个Linux面试题笔试题
2012/12/01 面试题
市场策划求职信
2014/08/07 职场文书
小学安全汇报材料
2014/08/14 职场文书
财会专业大学生求职信
2014/09/26 职场文书
Nginx进程管理和重载原理详解
2021/04/22 Servers
浅谈Python数学建模之线性规划
2021/06/23 Python
MySQL的prepare使用以及遇到的bug
2022/05/11 MySQL