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 相关文章推荐
ftp类(myftp.php)
Oct 09 PHP
处理php自动反斜杠的函数代码
Jan 05 PHP
简单的移动设备检测PHP脚本代码
Feb 19 PHP
探讨Smarty中如何获取数组的长度以及smarty调用php函数的详解
Jun 20 PHP
PHP 字符串长度判断效率更高的方法
Mar 02 PHP
一组PHP加密解密函数分享
Jun 05 PHP
Javascript与PHP验证用户输入URL地址是否正确
Oct 09 PHP
php从文件夹随机读取文件的方法
Jun 01 PHP
分享php分页的功能模块
Jun 16 PHP
编写PHP脚本清除WordPress头部冗余代码的方法讲解
Mar 01 PHP
Mac版PhpStorm之XAMPP整合apache服务器配置的图文教程详解
Oct 13 PHP
聊聊 PHP 8 新特性 Attributes
Aug 19 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
那些年我们错过的魔术方法(Magic Methods)
2014/01/14 PHP
PHP中多维数组的foreach遍历示例
2014/06/13 PHP
实例讲解PHP面向对象之多态
2014/08/20 PHP
thinkphp中ajax与php响应过程详解
2014/12/08 PHP
基于PHP制作验证码
2016/10/12 PHP
不用构造函数(Constructor)new关键字也能实现JavaScript的面向对象
2013/01/11 Javascript
jquery zTree异步加载简单实例分享
2013/02/05 Javascript
js 实现菜单上下显示附效果图
2013/11/21 Javascript
jquery动态加载js/css文件方法(自写小函数)
2014/10/11 Javascript
AngularJS实现一次监听多个值发生的变化
2016/08/31 Javascript
jQuery检查元素存在性(推荐)
2016/09/17 Javascript
利用angular.copy取消变量的双向绑定与解析
2016/11/25 Javascript
详解微信小程序 template添加绑定事件
2017/06/23 Javascript
详解利用jsx写vue组件的方法示例
2017/07/17 Javascript
vue的无缝滚动组件vue-seamless-scroll实例
2017/12/18 Javascript
vuejs实现折叠面板展开收缩动画效果
2018/09/06 Javascript
Vue2.0 v-for filter列表过滤功能的实现
2018/09/07 Javascript
Jquery的autocomplete插件用法及参数讲解
2019/03/12 jQuery
JavaScript实现点击切换验证码及校验
2021/01/10 Javascript
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
Python编写简单的HTML页面合并脚本
2016/07/11 Python
Python 网络爬虫--关于简单的模拟登录实例讲解
2018/06/01 Python
python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择
2020/02/26 Python
python中K-means算法基础知识点
2021/01/25 Python
波比布朗英国官网:Bobbi Brown英国
2017/11/13 全球购物
波兰家居饰品和厨房配件网上商店:Maleomi
2020/12/15 全球购物
servlet面试题
2012/08/20 面试题
土木工程专业个人求职信
2013/12/05 职场文书
幼儿教师考核制度
2014/01/25 职场文书
《美丽的丹顶鹤》教学反思
2014/04/22 职场文书
综合实践活动总结
2014/05/05 职场文书
公司周年庆活动方案
2014/08/25 职场文书
工作年限证明模板
2015/06/15 职场文书
关于golang高并发的实现与注意事项说明
2021/05/08 Golang
Python 读取千万级数据自动写入 MySQL 数据库
2022/06/28 Python
python 使用pandas读取csv文件的方法
2022/12/24 Python