简单谈谈php中ob_flush和flush的区别


Posted in PHP onNovember 27, 2014

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也可以, 只不过为了保证你代码的可移植性, 建议配套使用.

flush和ob_flush的使用上有一些特别注意的地方,造成无法刷新输出缓冲。

一. flush和ob_flush的正确顺序,先ob_flush再flush,如下:
ob_flush();
flush();
如果Web服务器的操作系统是windows系统,那顺序颠倒或者不使用ob_flush()也不会出现问题。但是在Linux系统上就无法刷新输出缓冲。

二. 使用ob_flush()前,确保前面的内容大小足够4069字符

一些Web服务器的output_buffering默认是4069字符或者更大,即输出内容必须达到4069字符服务器才会flush刷新输出缓冲,为了确保flush有效,最好在ob_flush()函数前有以下语句:
print str_repeat(" ", 4096);
以确保到达output_buffering值。

<?php

for ($i=1; $i<20; $i++)

{

echo "<font size='10' color='red'>".$i."</font>";

echo '<br>';

ob_flush();

flush();

sleep(1);

}

ob_end_flush();

?>
PHP 相关文章推荐
深入array multisort排序原理的详解
Jun 18 PHP
一个PHP的远程图片抓取函数分享
Sep 25 PHP
php采用ajax数据提交post与post常见方法总结
Nov 10 PHP
WampServer搭建php环境时遇到的问题汇总
Jul 23 PHP
PHP获取某个月最大天数(最后一天)的方法
Jul 29 PHP
PHP中explode函数和split函数的区别小结
Aug 24 PHP
php 时间time与日期date之间的使用详解及区别
Nov 07 PHP
Laravel如何自定义command命令浅析
Mar 23 PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
Apr 17 PHP
Laravel find in set排序实例
Oct 09 PHP
PHP实现简单的协程任务调度demo示例
Feb 01 PHP
laravel开发环境homestead搭建过程详解
Jul 03 PHP
浅谈php优化需要注意的地方
Nov 27 #PHP
PHP实现文件下载详解
Nov 27 #PHP
thinkphp的URL路由规则与配置实例
Nov 26 #PHP
thinkphp文件引用与分支结构用法实例
Nov 26 #PHP
PHP获取当前所在目录位置的方法
Nov 26 #PHP
thinkphp模板的包含与渲染实例分析
Nov 26 #PHP
PHP中strtr字符串替换用法详解
Nov 26 #PHP
You might like
使用无限生命期Session的方法
2006/10/09 PHP
PHP文件锁函数flock()详细介绍
2014/11/18 PHP
php进行支付宝开发中return_url和notify_url的区别分析
2014/12/22 PHP
javaScript call 函数的用法说明
2010/04/09 Javascript
js模拟滚动条(横向竖向)
2013/02/22 Javascript
JavaScript AJAX之惰性载入函数
2014/08/27 Javascript
js实现横向百叶窗效果网页切换动画效果的方法
2015/03/02 Javascript
JavaScript中字符串拼接的基本方法
2015/07/07 Javascript
javascript实现鼠标移到Image上方时显示文字效果的方法
2015/08/07 Javascript
JS+CSS实现TreeMenu二级树形菜单完整实例
2015/09/18 Javascript
Node.js程序中的本地文件操作用法小结
2016/03/06 Javascript
JavaScript SHA1加密算法实现详细代码
2016/10/06 Javascript
详解Node.js:events事件模块
2016/11/24 Javascript
Avalonjs 实现简单购物车功能(实例代码)
2017/02/07 Javascript
jQuery表单验证之密码确认
2017/05/22 jQuery
js 获取html5的data属性实现方法
2017/07/28 Javascript
在Vue组件化中利用axios处理ajax请求的使用方法
2017/08/25 Javascript
js和jQuery以及easyui实现对下拉框的指定赋值方法
2018/01/23 jQuery
vue ssr 指南详读
2018/06/29 Javascript
angular5 子组件监听父组件传入值的变化方法
2018/09/30 Javascript
js实现手表表盘时钟与圆周运动
2020/09/18 Javascript
Python+微信接口实现运维报警
2016/08/27 Python
Django 导出 Excel 代码的实例详解
2017/08/11 Python
解析python的局部变量和全局变量
2019/08/15 Python
Django实现内容缓存实例方法
2020/06/30 Python
HTML5 Canvas自定义圆角矩形与虚线示例代码
2013/08/02 HTML / CSS
5个HTML5的常用本地存储方式详解与介绍
2021/03/27 HTML / CSS
财务总经理岗位职责
2014/02/16 职场文书
自荐信的基本格式
2014/02/22 职场文书
西式结婚主持词
2014/03/14 职场文书
2014年惩防体系建设工作总结
2014/12/01 职场文书
财务工作失误检讨书
2015/02/19 职场文书
2015年办公室主任工作总结
2015/04/09 职场文书
2016年清明节期间群众祭祀活动工作总结
2016/04/01 职场文书
Python中的xlrd模块使用整理
2021/06/15 Python
Django框架中模型的用法
2022/06/10 Python