简单谈谈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 相关文章推荐
一个程序下载的管理程序(四)
Oct 09 PHP
支持oicq头像的留言簿(二)
Oct 09 PHP
php完全过滤HTML,JS,CSS等标签
Jan 16 PHP
Win2003+apache+PHP+SqlServer2008 配置生产环境
Jul 29 PHP
ThinkPHP中自定义错误页面和提示页面实例
Nov 22 PHP
php将文本文件转换csv输出的方法
Dec 31 PHP
php通过ksort()函数给关联数组按照键排序的方法
Mar 18 PHP
php显示指定目录下子目录的方法
Mar 20 PHP
各种快递查询--Api接口
Apr 26 PHP
PHP处理二进制数据的实现方法
Jun 13 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
Apr 02 PHP
如何使用php生成zip压缩包
Apr 21 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中显示格式化的用户输入
2006/10/09 PHP
php中常用编辑器推荐
2007/01/02 PHP
PHP 实例化类的一点摘记
2008/03/23 PHP
PHP 翻页 实例代码
2009/08/07 PHP
php去除重复字的实现代码
2011/09/16 PHP
html下载本地
2006/06/19 Javascript
基于jquery的checkbox下拉框插件代码
2010/06/25 Javascript
基于jQuery的左右滚动实现代码
2010/12/03 Javascript
jquery自定义下拉列表示例
2014/04/25 Javascript
jQuery插件制作之参数用法实例分析
2015/06/01 Javascript
基于RequireJS和JQuery的模块化编程——常见问题全面解析
2016/04/14 Javascript
js编写一个简单的产品放大效果代码
2016/06/27 Javascript
jQuery对table表格进行增删改查
2020/12/22 Javascript
js使用i18n实现页面国际化的方法
2017/05/09 Javascript
JS匹配日期和时间的正则表达式示例
2017/05/12 Javascript
vue.js 左侧二级菜单显示与隐藏切换的实例代码
2017/05/23 Javascript
jQuery实现可兼容IE6的淡入淡出效果告警提示功能示例
2017/09/20 jQuery
详解基于 Nuxt 的 Vue.js 服务端渲染实践
2017/10/24 Javascript
vue和webpack安装命令详解
2018/06/15 Javascript
更改BootStrap popover的默认样式及popover简单用法
2018/09/13 Javascript
详解VUE里子组件如何获取父组件动态变化的值
2018/12/26 Javascript
如何优雅地取消 JavaScript 异步任务
2020/03/22 Javascript
微信小程序实现点击导航标签滚动定位到对应位置
2020/11/19 Javascript
[00:32]2016完美“圣”典风云人物:Maybe宣传片
2016/12/05 DOTA
python随机模块random使用方法详解
2020/02/14 Python
彪马英国官网:PUMA英国
2019/02/11 全球购物
linux比较文件内容的命令是什么
2013/03/04 面试题
Java语言程序设计测试题改错题部分
2014/07/22 面试题
应届毕业生应聘自荐信
2013/12/07 职场文书
2014年银行员工工作总结
2014/11/12 职场文书
高中政治教学反思
2016/02/23 职场文书
让人感觉高大上的讲话稿怎么写?
2019/07/08 职场文书
微信小程序和php的登录实现
2021/04/01 PHP
python 实现mysql自动增删分区的方法
2021/04/01 Python
Oracle设置DB、监听和EM开机启动的方法
2021/04/25 Oracle
MySQL基础快速入门知识总结(附思维导图)
2021/09/25 MySQL