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 数组实例说明
Aug 18 PHP
PHP setcookie() cannot modify header information 的解决方法
Jan 09 PHP
使用php发送有附件的电子邮件-(PHPMailer使用的实例分析)
Apr 26 PHP
php使用curl模拟登录后采集页面的例子
Nov 04 PHP
linux实现php定时执行cron任务详解
Dec 24 PHP
PHP面向对象程序设计之类常量用法实例
Aug 20 PHP
ECSHOP在PHP5.5及高版本上报错的解决方法
Aug 31 PHP
php表单提交实例讲解
Nov 12 PHP
微信公众号OAuth2.0网页授权问题浅析
Jan 21 PHP
wordpress网站转移到本地运行测试的方法
Mar 15 PHP
Laravel创建数据库表结构的例子
Oct 09 PHP
PHP7 弃用功能
Mar 09 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
攻克CakePHP系列三 表单数据增删改
2008/10/22 PHP
PHP 函数执行效率的小比较
2010/10/17 PHP
PHP内存缓存Memcached类实例
2014/12/08 PHP
Javascript结合css实现网页换肤功能
2009/11/02 Javascript
利用js 进行输入框自动匹配字符的小例子
2013/06/29 Javascript
使用javascript创建快捷方式的简单实例
2013/08/09 Javascript
JavaScript使用循环和分割来替换和删除元素实例
2014/10/13 Javascript
javascript 构造函数方式定义对象
2015/01/02 Javascript
JavaScript中逗号运算符介绍及使用示例
2015/03/13 Javascript
JavaScript数组随机排列实现随机洗牌功能
2015/03/19 Javascript
JS实现文档加载完成后执行代码
2015/07/09 Javascript
jQuery自动添加表单项的方法
2015/07/13 Javascript
JavaScript中的定时器之Item23的合理使用
2015/10/30 Javascript
jQuery链式操作实例分析
2015/11/16 Javascript
微信小程序 页面跳转传递值几种方法详解
2017/01/12 Javascript
seajs模块压缩问题与解决方法实例分析
2017/10/10 Javascript
vue的无缝滚动组件vue-seamless-scroll实例
2017/12/18 Javascript
js中apply()和call()的区别与用法实例分析
2018/08/14 Javascript
python计算一个序列的平均值的方法
2015/07/11 Python
Python之读取TXT文件的方法小结
2018/04/27 Python
学习python分支结构
2019/05/17 Python
对python tkinter窗口弹出置顶的方法详解
2019/06/14 Python
python实现QQ批量登录功能
2019/06/19 Python
python 发送json数据操作实例分析
2019/10/15 Python
Python如何自动获取目标网站最新通知
2020/06/18 Python
Ann Taylor官方网站:美国最大的女性产品制造商之一
2016/09/14 全球购物
盖尔斯工厂店:GUESS Factory
2020/01/21 全球购物
用C语言实现文件读写操作
2013/10/27 面试题
编码实现字符串转整型的函数
2012/06/02 面试题
公积金单位接收函
2014/01/11 职场文书
中西医专业毕业生职业规划书
2014/02/24 职场文书
程序员求职信
2014/04/16 职场文书
合作经营协议书
2014/04/17 职场文书
法律专业大学生职业生涯规划书:向目标一步步迈进
2014/09/22 职场文书
redis配置文件中常用配置详解
2021/04/14 Redis
Python数据分析之pandas函数详解
2021/04/21 Python