PHP flush 函数使用注意事项


Posted in PHP onAugust 26, 2016

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标记的开头之前缓存内容,并且在接受到 标记之前,不会显示出整个表格。

一些版本的 Microsoft Internet Explorer
只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。

所以, 正确使用俩者的顺序是. 先ob_flush, 然后flush,

当然, 在其他sapi下, 不调用flush也可以, 只不过为了保证你代码的可移植性, 建议配套使用.

<?php
// set_time_limit(0);
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
// ob_end_flush();
// ini_set('output_buffering', 0);
// ini_set('implicit_flush', 1);
if (ob_get_level() == 0) ob_start();
echo str_repeat(' ' ,4096);
$long = 60;
while($long > 0)
{
$time = date('r');
echo "data: The server time is: {$time}\n\n";
ob_flush();
flush();//break;
sleep(1);
$long --;
}
// var source=new EventSource("http://localhost:18000/sse.php");source.onmessage=function(event){console.info(event.data)};
?>

如果要在 nginx + fpm + php 上支持需要加一个响应头

header('X-Accel-Buffering: no');
This eliminates both proxy_buffering and (if you have nginx >= 1.5.6), fastcgi_buffering. The fastcgi bit is crucial if you're using php-fpm. The header is also far more convenient to do on an as-needed basis.
Docs on X-Accel-Buffering http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_buffering ;

<?php
// set_time_limit(0);
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('X-Accel-Buffering: no');

// ob_end_flush();
// ini_set('output_buffering', 0);
// ini_set('implicit_flush', 1);

// if (ob_get_level() == 0) ob_start();
// echo str_repeat(' ' ,4096);

$long = 60;
while($long > 0)
{
	$time = date('r');
	echo "data: The server time is: {$time}\n\n";
	ob_flush();
	
	flush();//break;
	sleep(1);
	$long --;
}
// var source=new EventSource("http://localhost:18000/sse.php");source.onmessage=function(event){console.info(event.data)};
?>
PHP 相关文章推荐
通过PHP修改Linux或Unix口令的方法分享
Jan 30 PHP
PHP遍历目录并返回统计目录大小
Jun 09 PHP
thinkphp实现发送邮件密码找回功能实例
Dec 01 PHP
PHP使用curl模拟post上传及接收文件的方法
Mar 04 PHP
Smarty模板变量调节器用法分析
May 23 PHP
php结合mysql与mysqli扩展处理事务的方法
Jun 29 PHP
利用PHP抓取百度阅读的方法示例
Dec 18 PHP
PHP面向对象学习之parent::关键字
Jan 18 PHP
PHP的反射机制实例详解
Mar 29 PHP
PHP里的$_GET数组介绍
Mar 22 PHP
Yii框架分页技术实例分析
Aug 30 PHP
Laravel 模型使用软删除-左连接查询-表起别名示例
Oct 24 PHP
PHP获取不了React Native Fecth参数的解决办法
Aug 26 #PHP
简单的pgsql pdo php操作类实现代码
Aug 25 #PHP
php mongodb操作类 带几个简单的例子
Aug 25 #PHP
php flush无效,IIS7下php实时输出的方法
Aug 25 #PHP
php 的反射详解及示例代码
Aug 25 #PHP
php 输入输出流详解及示例代码
Aug 25 #PHP
PHP 输出缓冲控制(Output Control)详解
Aug 25 #PHP
You might like
PHP实现对文件锁进行加锁、解锁操作的方法
2017/07/04 PHP
javascript 设为首页与加入收藏兼容多浏览器代码
2011/01/11 Javascript
基于Jquery制作的幻灯片图集效果打包下载
2011/02/12 Javascript
自定义一个jquery插件[鼠标悬浮时候 出现说明label]
2011/06/27 Javascript
兼容IE和Firefox的javascript获取iframe文档内容的函数
2011/08/15 Javascript
js 窗口抖动示例
2013/09/04 Javascript
js获取select默认选中的Option并不是当前选中值
2014/05/07 Javascript
js实现简单的购物车有图有代码
2014/05/26 Javascript
javascript学习笔记(五)原型和原型链详解
2014/10/08 Javascript
javascript实现数独解法
2015/03/14 Javascript
详解JavaScript正则表达式中的global属性的使用
2015/06/16 Javascript
TypeScript 学习笔记之基本类型
2015/06/19 Javascript
jQuery悬停文字提示框插件jquery.tooltipster.js用法示例【附demo源码下载】
2016/07/19 Javascript
AngularJS动态绑定HTML的方法分析
2016/11/07 Javascript
原生js和css实现图片轮播效果
2017/02/07 Javascript
为什么我们要做三份 Webpack 配置文件
2017/09/18 Javascript
node打造微信个人号机器人的方法示例
2018/04/26 Javascript
jQuery实现表单动态添加数据并提交的方法
2018/07/19 jQuery
video.js 一个页面同时播放多个视频的实例代码
2018/11/27 Javascript
Python中的对象,方法,类,实例,函数用法分析
2015/01/15 Python
python深度优先搜索和广度优先搜索
2018/02/07 Python
pandas多级分组实现排序的方法
2018/04/20 Python
使用Python 正则匹配两个特定字符之间的字符方法
2018/12/24 Python
python之当你发现QTimer不能用时的解决方法
2019/06/21 Python
Python socket 套接字实现通信详解
2019/08/27 Python
python自动化测试之异常及日志操作实例分析
2019/11/09 Python
django restframework serializer 增加自定义字段操作
2020/07/15 Python
Django DRF APIView源码运行流程详解
2020/08/17 Python
python import 上级目录的导入
2020/11/03 Python
Monki官网:斯堪的纳维亚的独立时尚品牌
2020/11/09 全球购物
经典c++面试题二
2015/08/14 面试题
机电专业个人求职信范文
2013/12/30 职场文书
优秀班主任事迹材料
2014/12/16 职场文书
2015年客服工作总结范文
2015/04/02 职场文书
农业项目合作意向书
2015/05/08 职场文书
校车安全管理责任书
2015/05/11 职场文书