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 相关文章推荐
smtp邮件发送一例
Oct 09 PHP
PHP 编程请选择正确的文本编辑软件
Dec 21 PHP
php 学习资料零碎东西
Dec 04 PHP
防止用户利用PHP代码DOS造成用光网络带宽
Mar 01 PHP
使用Sphinx对索引进行搜索
Jun 25 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
Dec 19 PHP
ThinkPHP3.2.2实现持久登录(记住我)功能的方法
May 16 PHP
PHP实现支持加盐的图片加密解密
Sep 09 PHP
PHP获取中国时间(上海时区时间)及美国时间的方法
Feb 23 PHP
PHP常用工具函数小结【移除XSS攻击、UTF8与GBK编码转换等】
Apr 27 PHP
laravel框架实现为 Blade 模板引擎添加新文件扩展名操作示例
Jan 25 PHP
PHP中迭代器的简单实现及Yii框架中的迭代器实现方法示例
Apr 26 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的一个完整SMTP类(解决邮件服务器需要验证时的问题)
2006/10/09 PHP
一个php作的文本留言本的例子(二)
2006/10/09 PHP
Symfony页面的基本创建实例详解
2015/01/26 PHP
php图片添加水印例子
2016/07/20 PHP
PHP多个图片压缩成ZIP的方法
2020/08/18 PHP
php模拟post提交请求调用接口示例解析
2020/08/07 PHP
最常用的12种设计模式小结
2011/08/09 Javascript
使用纯javascript实现放大镜效果
2015/03/18 Javascript
jQuery.form插件的使用及跨域异步上传文件
2016/04/27 Javascript
用jQuery获取table中行id和td值的实现代码
2016/05/19 Javascript
prototype.js常用函数详解
2016/06/18 Javascript
使用jQuery5分钟快速搞定双色表格的简单实例
2016/08/08 Javascript
Angular的事件和表单详解
2016/12/26 Javascript
jQuery分页插件jquery.pagination.js使用方法解析
2017/02/09 Javascript
ionic3 懒加载
2017/08/16 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【凹多边形的分离轴检测算法】
2018/12/13 Javascript
详解Vue中组件传值的多重实现方式
2019/08/16 Javascript
JavaScript提升机制Hoisting详解
2019/10/23 Javascript
使用Vant完成通知栏Notify的提示操作
2020/11/11 Javascript
Vue使用鼠标在Canvas上绘制矩形
2020/12/24 Vue.js
[01:14:05]《加油DOTA》第四期
2014/08/25 DOTA
[01:35]辉夜杯战队访谈宣传片—iG.V
2015/12/25 DOTA
python类型强制转换long to int的代码
2013/02/10 Python
Python中for循环控制语句用法实例
2015/06/02 Python
Django框架模板介绍
2019/01/15 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
2019/06/24 Python
django用户登录验证的完整示例代码
2019/07/21 Python
Stylenanda中文站:韩国一线网络服装品牌
2016/12/22 全球购物
伯克斯奥特莱斯:Burkes Outlet
2019/03/30 全球购物
农村党支部书记司法四风问题对照检查材料
2014/09/26 职场文书
工厂员工辞职信范文
2015/05/12 职场文书
初婚初育证明范本
2015/06/18 职场文书
纪委立案决定书
2015/06/24 职场文书
2019广播稿怎么写
2019/04/17 职场文书
海弦WR-800F
2022/04/05 无线电
IIS服务器中设置HTTP重定向访问HTTPS
2022/04/29 Servers