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版自动生成文章摘要
Jul 23 PHP
PHP Directory 函数的详解
Mar 07 PHP
php中url函数介绍及使用示例
Feb 13 PHP
PHP回溯法解决0-1背包问题实例分析
Mar 23 PHP
Mac环境下php操作mysql数据库的方法分享
May 11 PHP
PHP使用file_get_content设置头信息的方法
Feb 14 PHP
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
Mar 21 PHP
[原创]php常用字符串输出方法分析(echo,print,printf及sprintf)
Jul 09 PHP
PHP使用preg_split()分割特殊字符(元字符等)的方法分析
Feb 04 PHP
php分页查询mysql结果的base64处理方法示例
May 18 PHP
实例讲解YII2中多表关联的使用方法
Jul 21 PHP
ThinkPHP 5.1 跨域配置方法
Oct 11 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中删除变量时unset()和null的区别分析
2011/01/27 PHP
Zend Framework实现留言本分页功能(附demo源码下载)
2016/03/22 PHP
css图片自适应大小
2007/11/28 Javascript
JQuery AJAX实现目录浏览与编辑的代码
2008/10/21 Javascript
一个原生的用户等级的进度条
2010/07/03 Javascript
使用Jquery打造最佳用户体验的登录页面的实现代码
2011/07/08 Javascript
js获取图片大小的函数代码
2011/09/20 Javascript
使用JQuery库提供的扩展功能实现自定义方法
2014/09/09 Javascript
使用Javascript简单实现图片无缝滚动
2014/12/05 Javascript
javascript基于DOM实现权限选择实例分析
2015/05/14 Javascript
JavaScript检查数字是否为整数或浮点数的方法
2015/06/09 Javascript
javascript比较两个日期相差天数的方法
2015/07/23 Javascript
JavaScript识别网页关键字并进行描红的方法
2015/11/09 Javascript
基于Bootstrap重置输入框内容按钮插件
2016/05/12 Javascript
微信小程序 Video API实例详解
2016/10/02 Javascript
gulp解决跨域的配置文件问题
2017/06/08 Javascript
jquery插件canvaspercent.js实现百分比圆饼效果
2017/07/18 jQuery
详解为生产环境编译Angular2应用的方法
2018/12/10 Javascript
layui的layedit富文本赋值方法
2019/09/18 Javascript
vue之a-table中实现清空选中的数据
2019/11/07 Javascript
微信小程序实现单个或多个倒计时功能
2020/11/01 Javascript
[16:19]教你分分钟做大人——风暴之灵
2015/03/11 DOTA
python字典get()方法用法分析
2015/04/17 Python
Python多进程机制实例详解
2015/07/02 Python
python 数据的清理行为实例详解
2017/07/12 Python
基于随机梯度下降的矩阵分解推荐算法(python)
2018/08/31 Python
手把手教你Python yLab的绘制折线图的画法
2019/10/23 Python
Python HTMLTestRunner库安装过程解析
2020/05/25 Python
Django Admin 上传文件到七牛云的示例代码
2020/06/20 Python
技校个人求职信范文
2014/01/25 职场文书
优秀学生干部先进事迹材料
2014/05/26 职场文书
2015入党自荐书范文
2015/03/05 职场文书
2019年大学生职业生涯规划书
2019/03/25 职场文书
正确的理解和使用Django信号(Signals)
2021/04/14 Python
Redisson实现Redis分布式锁的几种方式
2021/08/07 Redis
解决MySQL添加新用户-ERROR 1045 (28000)的问题
2022/03/03 MySQL