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之第一天
Oct 09 PHP
在PWS上安装PHP4.0正式版
Oct 09 PHP
phpMyAdmin 安装教程全攻略
Mar 19 PHP
php allow_url_include的应用和解释
Apr 22 PHP
apache mysql php 源码编译使用方法
May 03 PHP
php Hex RGB颜色值互换的使用
May 10 PHP
PHP判断变量是否为0的方法
Feb 08 PHP
PHP的mysqli_query参数MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT的区别
Sep 29 PHP
php动态生成缩略图并输出显示的方法
Apr 20 PHP
调用WordPress函数统计文章访问量及PHP原生计数器的实现
Mar 21 PHP
Zend Framework实现将session存储在memcache中的方法
Mar 22 PHP
PHP 布尔值的自增与自减的实现方法
May 03 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获取redis里不存在的6位随机数应用示例【设置24小时过时】
2017/06/07 PHP
php的RSA加密解密算法原理与用法分析
2020/01/23 PHP
IE下使用cloneNode注意事项分享
2012/11/22 Javascript
图片img的src不变让浏览器重新加载实现方法
2013/03/29 Javascript
js仿百度有啊通栏展示效果实现代码
2013/05/28 Javascript
js日期对象兼容性的处理方法
2014/01/28 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
2015/03/24 Javascript
JavaScript简单获取系统当前时间完整示例
2016/08/02 Javascript
JS监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
2016/08/05 Javascript
H5用户注册表单页 注册模态框!
2016/09/17 Javascript
深入理解Angular.JS中的Scope继承
2017/06/04 Javascript
vue component组件使用方法详解
2017/07/14 Javascript
详解angular部署到iis出现404解决方案
2018/08/14 Javascript
LayUi中接口传数据成功,表格不显示数据的解决方法
2018/08/19 Javascript
vue基础之v-bind属性、class和style用法分析
2019/03/11 Javascript
JavaScript 继承 封装 多态实现及原理详解
2019/07/29 Javascript
Vue作用域插槽实现方法及作用详解
2020/07/08 Javascript
javascript实现电商放大镜效果
2020/11/23 Javascript
浅谈Vue使用Elementui修改默认的最快方法
2020/12/05 Vue.js
[52:00]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs Optic
2018/04/02 DOTA
python持久性管理pickle模块详细介绍
2015/02/18 Python
使用Python设置tmpfs来加速项目的教程
2015/04/17 Python
pycharm debug功能实现跳到循环末尾的方法
2018/11/29 Python
Python + OpenCV 实现LBP特征提取的示例代码
2019/07/11 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
2019/08/28 Python
opencv设置采集视频分辨率方式
2019/12/10 Python
pycharm内无法import已安装的模块问题解决
2020/02/12 Python
基于python实现删除指定文件类型
2020/07/21 Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
2020/11/26 Python
css3截图_动力节点Java学院整理
2017/07/11 HTML / CSS
基于HTML5 WebGL的3D机房的示例
2018/03/16 HTML / CSS
恶搞卫生巾广告词
2014/03/18 职场文书
小学生演讲稿大全
2014/04/25 职场文书
荷叶母亲教学反思
2014/04/30 职场文书
寒暑假实习证明书模板
2014/11/29 职场文书
vue中this.$http.post()跨域和请求参数丢失的解决
2022/04/08 Vue.js