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 相关文章推荐
PHP 事务处理数据实现代码
May 13 PHP
php imagecreatetruecolor 创建高清和透明图片代码小结
May 15 PHP
Zend Framework页面缓存实例
Jun 25 PHP
PHP中auto_prepend_file与auto_append_file用法实例分析
Sep 22 PHP
如何写php守护进程(Daemon)
Dec 30 PHP
Laravel配置全局公共函数的方法步骤
May 09 PHP
Laravel如何同时连接多个数据库详解
Aug 13 PHP
laravel5 Eloquent 实现事务方式
Oct 21 PHP
Thinkphp 框架扩展之应用模式实现方法分析
Apr 27 PHP
Thinkphp集成抖音SDK的实现方法
Apr 28 PHP
浅谈php常用的7大框架的优缺点
Jul 20 PHP
PHP实现两种排课方式
Jun 26 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
PHP 获取远程文件内容的函数代码
2010/03/24 PHP
基于PHP array数组的教程详解
2013/06/05 PHP
destoon首页调用求购供应信息的地区名称的方法
2014/08/21 PHP
PHP下的Oracle客户端扩展(OCI8)安装教程
2014/09/10 PHP
smarty自定义函数用法示例
2016/05/20 PHP
十个迅速提升JQuery性能让你的JQuery跑得更快
2012/12/10 Javascript
JS判断字符串长度的5个方法(区分中文和英文)
2014/03/18 Javascript
jQuery瀑布流插件Wookmark使用实例
2014/04/02 Javascript
javascript记录文本框内文字个数检测文字个数变化
2014/10/14 Javascript
jQuery实现的超酷苹果风格图标滑出菜单效果代码
2015/09/16 Javascript
js判断手机访问或者PC的几个例子(常用于手机跳转)
2015/12/15 Javascript
javascript数组去重小结
2016/03/07 Javascript
Angularjs使用directive自定义指令实现attribute继承的方法详解
2016/08/05 Javascript
jQuery获取所有父级元素及同级元素及子元素的方法(推荐)
2018/01/21 jQuery
对Vue- 动态元素属性及v-bind和v-model的区别详解
2018/08/27 Javascript
如何为vuex实现带参数的 getter和state.commit
2019/01/04 Javascript
vue列表单项展开收缩功能之this.$refs的详解
2019/05/05 Javascript
[02:41]DOTA2英雄基础教程 冥魂大帝
2014/01/16 DOTA
Django查找网站项目根目录和对正则表达式的支持
2015/07/15 Python
python用pickle模块实现“增删改查”的简易功能
2017/06/07 Python
python实现决策树、随机森林的简单原理
2018/03/26 Python
python安装twisted的问题解析
2018/08/21 Python
Django如何防止定时任务并发浅析
2019/05/14 Python
如何在Django项目中引入静态文件
2019/07/26 Python
keras训练浅层卷积网络并保存和加载模型实例
2020/07/02 Python
Python getsizeof()和getsize()区分详解
2020/11/20 Python
巧用CSS3的calc()宽度计算做响应模式布局的方法
2018/03/22 HTML / CSS
解决img标签上下出现间隙的方法
2016/12/14 HTML / CSS
ParcelABC西班牙:包裹运送和快递服务
2019/12/24 全球购物
分厂厂长岗位职责
2013/12/29 职场文书
优秀高中生事迹材料
2014/02/11 职场文书
《挑山工》的教学反思
2014/02/16 职场文书
水毁工程实施方案
2014/04/01 职场文书
市场营销计划书
2015/01/17 职场文书
2016感恩父亲节主题广播稿
2015/12/18 职场文书
十大最强岩石系宝可梦,怪颚龙实力最强,第七破坏力很强
2022/03/18 日漫