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 相关文章推荐
实时抓取YAHOO股票报价的代码
Oct 09 PHP
PHP Cookie的使用教程详解
Jun 03 PHP
ThinkPHP模板中判断volist循环的最后一条记录的验证方法
Jul 01 PHP
php遍历目录方法小结
Mar 10 PHP
php简单获取文件扩展名的方法
Mar 24 PHP
php利用事务处理转账问题
Apr 22 PHP
PHP版本如何选择?应该使用哪个版本?
May 13 PHP
php简单实现文件或图片强制下载的方法
Dec 06 PHP
YII框架批量插入数据的方法
Mar 18 PHP
PHP实现基于面向对象的mysqli扩展库增删改查操作工具类
Jul 18 PHP
PHP的PDO预处理语句与存储过程
Jan 27 PHP
laravel 实现设置时区的简单方法
Oct 10 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 模拟POST|GET操作实现代码
2010/07/20 PHP
php中经典方法实现判断多维数组是否为空
2011/10/23 PHP
PHP实现过滤掉非汉字字符只保留中文字符
2015/06/04 PHP
Yii2中cookie用法示例分析
2016/07/18 PHP
PHP实现创建微信自定义菜单的方法示例
2017/07/14 PHP
JavaScript中的prototype使用说明
2010/04/13 Javascript
autoPlay 基于jquery的图片自动播放效果
2011/12/07 Javascript
用函数模板,写一个简单高效的 JSON 查询器的方法介绍
2013/04/17 Javascript
js中widow.open()方法使用详解
2013/07/30 Javascript
jQuery实现图片上传和裁剪插件Croppie
2015/11/29 Javascript
js实现的星星评分功能函数
2015/12/09 Javascript
自动完成的搜索框javascript实现
2016/02/26 Javascript
一览画面点击复选框后获取多个id值的方法
2016/05/30 Javascript
jquery Easyui Datagrid实现批量操作(编辑,删除,添加)
2017/02/20 Javascript
Angular 2 利用Router事件和Title实现动态页面标题的方法
2017/08/23 Javascript
Vue项目中设置背景图片方法
2018/02/21 Javascript
Angular4集成ng2-file-upload的上传组件
2018/03/14 Javascript
elementUI vue this.$confirm 和el-dialog 弹出框 移动 示例demo
2019/07/03 Javascript
移动端手指操控左右滑动的菜单
2019/09/08 Javascript
Ant-design-vue Table组件customRow属性的使用说明
2020/10/28 Javascript
js实现电灯开关效果
2021/01/19 Javascript
python正则分组的应用
2013/11/10 Python
浅谈Python批处理文件夹中的txt文件
2019/03/11 Python
django富文本编辑器的实现示例
2019/04/10 Python
python程序快速缩进多行代码方法总结
2019/06/23 Python
详解PANDAS 数据合并与重塑(join/merge篇)
2019/07/09 Python
爬虫代理池Python3WebSpider源代码测试过程解析
2019/12/20 Python
Python中断多重循环的几种方式详解
2020/02/10 Python
css3实现蒙版弹幕功能
2019/06/18 HTML / CSS
CSS3实现文字描边的2种方法(小结)
2020/02/14 HTML / CSS
美国畅销的跑步机品牌:ProForm
2017/02/06 全球购物
中学生个人自我评价
2014/02/06 职场文书
优秀工会工作者事迹材料
2014/06/02 职场文书
2015年学校综合治理工作总结
2015/07/20 职场文书
毕业生自荐求职信书写的技巧
2019/08/26 职场文书
vue实现无缝轮播效果(跑马灯)
2021/05/14 Vue.js