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 文件上传进度条的两种实现方法的代码
Nov 25 PHP
php split汉字
Jun 05 PHP
让PHP COOKIE立即生效,不用刷新就可以使用
Mar 09 PHP
Drupal 添加模块出现莫名其妙的错误的解决方法(往往出现在模块较多时)
Apr 18 PHP
php笔记之:初探PHPcms模块开发介绍
Apr 26 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
Mar 13 PHP
php实现两个数组相加的方法
Feb 17 PHP
浅析php-fpm静态和动态执行方式的比较
Nov 09 PHP
PHP用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID
Nov 25 PHP
php通过各种函数判断0和空
Jul 04 PHP
PHP观察者模式示例【Laravel框架中有用到】
Jun 15 PHP
基于PHP实现用户在线状态检测
Nov 10 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个人网站架设连环讲(一)
2006/10/09 PHP
smarty内置函数section的用法
2015/01/22 PHP
浅谈php7的重大新特性
2015/10/23 PHP
Zend Framework入门教程之Zend_Config组件用法详解
2016/12/09 PHP
Laravel框架中缓存的使用方法分析
2019/09/06 PHP
文本有关的样式和jQuery求对象的高宽问题分别说明
2013/08/30 Javascript
Javascript小技巧之生成html元素
2014/05/15 Javascript
js监听鼠标点击和键盘点击事件并自动跳转页面
2014/09/24 Javascript
JS打字效果的动态菜单代码分享
2015/08/21 Javascript
JavaScript数据类型学习笔记
2016/01/25 Javascript
JavaScript获取客户端IP的方法(新方法)
2016/03/11 Javascript
省市选择的简单实现(基于zepto.js)
2016/06/21 Javascript
浅析Bootstrap表格的使用
2016/06/23 Javascript
在一个页面重复使用一个js函数的方法详解
2016/12/26 Javascript
jquery实现焦点轮播效果
2017/02/23 Javascript
AngularJS动态绑定ng-options的ng-model实例代码
2017/06/21 Javascript
vue2.0 资源文件assets和static的区别详解
2018/04/08 Javascript
关于Angularjs中跨域设置白名单问题
2018/04/17 Javascript
Vue动态组件与异步组件实例详解
2019/02/23 Javascript
[01:15:00]LGD vs Mineski Supermajor 胜者组 BO3 第一场 6.5
2018/06/06 DOTA
Python常用模块用法分析
2014/09/08 Python
python3.6的venv模块使用详解
2018/08/01 Python
python找出完数的方法
2018/11/12 Python
tensorflow的ckpt及pb模型持久化方式及转化详解
2020/02/12 Python
python super函数使用方法详解
2020/02/14 Python
jupyter 中文乱码设置编码格式 避免控制台输出的解决
2020/04/20 Python
python3 循环读取excel文件并写入json操作
2020/07/14 Python
Python命令行参数定义及需要注意的地方
2020/11/30 Python
在vscode中启动conda虚拟环境的思路详解
2020/12/25 Python
Opencv 图片的OCR识别的实战示例
2021/03/02 Python
详解Html5中video标签那些属性和方法
2019/07/01 HTML / CSS
利用纯html5绘制出来的一款非常漂亮的时钟
2015/01/04 HTML / CSS
阿迪达斯法国官方网站:adidas法国
2018/03/20 全球购物
成人教育自我鉴定
2013/11/01 职场文书
国家助学贷款承诺书
2015/04/30 职场文书
keepalived + nginx 实现高可用方案
2022/12/24 Servers