PHP逐行输出(ob_flush与flush的组合)


Posted in PHP onFebruary 04, 2012

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也可以, 只不过为了保证你代码的可移植性, 建议配套使用.
在IE 中,必须先输出256个字节,才起作用,如下代码:

function execte(){ 
echo str_pad(" ", 256); 
for ($i=1;$i<10;$i++){ 
echo $i."<Br>"; 
ob_flush(); 
flush(); 
sleep(1); 
} 
}
PHP 相关文章推荐
在PHP3中实现SESSION的功能(二)
Oct 09 PHP
Mysql的GROUP_CONCAT()函数使用方法
Mar 28 PHP
php二维数组排序与默认自然排序的方法介绍
Apr 27 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(五)
Jun 23 PHP
Yii入门教程之Yii安装及hello world
Nov 25 PHP
php实现将字符串按照指定距离进行分割的方法
Mar 14 PHP
php实现TCP端口检测的方法
Apr 01 PHP
php递归遍历删除文件的方法
Apr 17 PHP
PHP使用NuSOAP调用Web服务的方法
Jul 18 PHP
开启PHP Static 关键字之旅模式
Nov 13 PHP
PHP数据库操作Helper类完整实例
May 11 PHP
PHP依赖注入原理与用法分析
Aug 21 PHP
非常好用的两个PHP函数 serialize()和unserialize()
Feb 04 #PHP
PHP判断搜索引擎蜘蛛并自动记忆到文件的代码
Feb 04 #PHP
PHP的博客ping服务代码
Feb 04 #PHP
Ping服务的php实现方法,让网站快速被收录
Feb 04 #PHP
PHP常用技巧总结(附函数代码)
Feb 04 #PHP
PHP语言中global和$GLOBALS[]的分析 之二
Feb 02 #PHP
php中global和$GLOBALS[]的分析之一
Feb 02 #PHP
You might like
《魔兽争霸3》重制版究竟重制了什么?玩家:这么糊弄真的好吗?
2020/05/04 魔兽争霸
php操作(删除,提取,增加)zip文件方法详解
2015/03/12 PHP
删除PHP数组中头部、尾部、任意元素的实现代码
2017/04/10 PHP
用javascript实现给图片加链接
2007/08/15 Javascript
javascript之AJAX框架使用说明
2010/04/24 Javascript
javascript制作loading动画效果 loading效果
2014/01/14 Javascript
让jQuery Mobile不显示讨厌loading界面的方法
2014/02/19 Javascript
chrome浏览器当表单自动填充时如何去除浏览器自动添加的默认样式
2015/10/09 Javascript
JS 实现倒计时数字时钟效果【附实例代码】
2016/03/30 Javascript
创建一个类Person的简单实例
2016/05/17 Javascript
JS简单实现tab切换效果的多窗口显示功能
2016/09/07 Javascript
ExtJS 4.2 Grid组件单元格合并的方法
2016/10/12 Javascript
学习JS中的DOM节点以及操作
2018/04/30 Javascript
jQuery实现列表的增加和删除功能
2018/06/14 jQuery
iview Upload组件多个文件上传的示例代码
2018/09/30 Javascript
生产制造追溯系统之在线打印功能
2019/06/03 Javascript
vue router总结 $router和$route及router与 router与route区别
2019/07/05 Javascript
es6中比较有用的7个技巧小结
2019/07/12 Javascript
浅谈layui里的上传控件问题
2019/09/26 Javascript
基于JavaScript实现大文件上传后端代码实例
2020/08/18 Javascript
vue实现表格合并功能
2020/12/01 Vue.js
python迭代器实例简析
2014/09/25 Python
恢复百度云盘本地误删的文件脚本(简单方法)
2017/10/21 Python
一文带你了解Python中的字符串是什么
2018/11/20 Python
对Python发送带header的http请求方法详解
2019/01/02 Python
使用Pytorch来拟合函数方式
2020/01/14 Python
日语专业毕业生自荐信
2013/11/11 职场文书
中文系学生自荐信范文
2013/11/13 职场文书
在校生自我鉴定
2014/01/23 职场文书
就业推荐表自我鉴定范文
2014/03/21 职场文书
师范生自荐信模板
2014/05/28 职场文书
学校世界艾滋病日宣传活动总结
2015/05/05 职场文书
在校证明模板
2015/06/17 职场文书
学生会副主席竞选稿
2015/11/19 职场文书
筑梦中国心得体会
2016/01/18 职场文书
《富饶的西沙群岛》教学反思
2016/02/16 职场文书