简单谈谈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
ThinkPHP写第一个模块应用
Feb 20 PHP
php中is_null,empty,isset,unset 的区别详细介绍
Apr 28 PHP
解析thinkphp import 文件内容变量失效的问题
Jun 20 PHP
关于url地址传参数时字符串有回车造成页面脚本赋值失败的解决方法
Jun 28 PHP
浅析十款PHP开发框架的对比
Jul 05 PHP
php上传图片客户端和服务器端实现方法
Mar 30 PHP
通过修改配置真正解决php文件上传大小限制问题(nginx+php)
Sep 23 PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
Oct 22 PHP
php ci 获取表单中多个同名input元素值的代码
Mar 25 PHP
PHP 常用时间函数资料整理
Oct 22 PHP
Laravel使用Queue队列的技巧汇总
Sep 02 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
虫族 Zerg 历史背景
2020/03/14 星际争霸
模拟OICQ的实现思路和核心程序(三)
2006/10/09 PHP
一个基于phpQuery的php通用采集类分享
2014/04/09 PHP
PHP curl实现抓取302跳转后页面的示例
2014/07/04 PHP
Yii框架操作cookie与session的方法实例详解
2019/09/04 PHP
Span元素的width属性无效果原因及解决方案
2010/01/15 Javascript
javascript中字符串拼接需注意的问题
2010/07/13 Javascript
js下通过prototype扩展实现indexOf的代码
2010/12/08 Javascript
JQuery中关于jquery.js与jquery.min.js的比较探讨
2013/05/15 Javascript
jQuery添加/改变/移除CSS类及判断是否已经存在CSS
2014/08/20 Javascript
JavaScript把数组作为堆栈使用的方法
2015/03/20 Javascript
jqTransform美化表单
2015/10/10 Javascript
JS实现简单的二维矩阵乘积运算
2016/01/26 Javascript
前端面试题及答案整理(二)
2016/08/26 Javascript
浅谈JS中的!=、== 、!==、===的用法和区别
2016/09/24 Javascript
JS弹性运动实现方法分析
2016/12/15 Javascript
jQuery使用正则验证15/18身份证的方法示例
2017/04/27 jQuery
详解Angular2学习笔记之Html属性绑定
2018/01/03 Javascript
vue编译打包本地查看index文件的方法
2018/02/23 Javascript
Vue中&quot;This dependency was not found&quot;问题的解决方法
2018/06/19 Javascript
Vue源码探究之状态初始化
2018/11/14 Javascript
JQuery实现ajax请求的示例和注意事项
2018/12/10 jQuery
结合Python的SimpleHTTPServer源码来解析socket通信
2016/06/27 Python
使用Flask集成bootstrap的方法
2018/07/24 Python
Python常用爬虫代码总结方便查询
2019/02/25 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
2019/06/17 Python
django中的图片验证码功能
2019/09/18 Python
Python多线程模块Threading用法示例小结
2019/11/09 Python
英国网上花店:Bunches
2016/11/29 全球购物
联想哥伦比亚网上商城:Lenovo Colombia
2017/01/10 全球购物
美国滑板店:Tactics
2020/11/08 全球购物
荷兰天然和有机产品网上商城:BigGreenSmile.nl
2020/07/26 全球购物
企业行政文员岗位职责
2013/12/03 职场文书
广告设计应届生求职信
2014/03/01 职场文书
舞蹈专业大学生职业规划范文
2014/03/12 职场文书
如何通过简单的代码描述Angular父组件、子组件传值
2022/04/07 Javascript