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 创建文件(文件夹)以及目录操作代码
Mar 04 PHP
php邮件发送,php发送邮件的类
Mar 24 PHP
windows环境下php配置memcache的具体操作步骤
Jun 09 PHP
php中的静态变量的基本用法
Mar 20 PHP
一个完整的php文件上传类实例讲解
Oct 27 PHP
PHP MVC框架路由学习笔记
Mar 02 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
May 19 PHP
PHP经典算法集锦【经典收藏】
Sep 14 PHP
php从身份证获取性别和出生年月
Feb 09 PHP
YII框架批量插入数据的方法
Mar 18 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
May 02 PHP
PHP中的异常处理机制深入讲解
Nov 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
深入eAccelerator与memcached的区别详解
2013/06/06 PHP
从零开始学YII2框架(六)高级应用程序模板
2014/08/20 PHP
Laravel 5框架学习之日期,Mutator 和 Scope
2015/04/08 PHP
Yii 2中的load()和save()示例详解
2017/08/03 PHP
浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
2019/10/21 PHP
Mootools 1.2 手风琴(Accordion)教程
2009/09/15 Javascript
再谈javascript 动态添加样式规则 W3C校检
2009/12/25 Javascript
jQuery focus和blur事件的应用详解
2014/01/26 Javascript
用js读、写、删除Cookie代码分享及详细注释说明
2014/06/05 Javascript
js生成验证码并直接在前端判断
2015/05/15 Javascript
原生js实现模拟滚动条
2015/06/15 Javascript
使用node+vue.js实现SPA应用
2016/01/28 Javascript
Javascript类型系统之undefined和null浅析
2016/07/13 Javascript
详解NodeJs支付宝移动支付签名及验签
2017/01/06 NodeJs
React实现todolist功能
2020/12/28 Javascript
Python高斯消除矩阵
2019/01/02 Python
一些关于python 装饰器的个人理解
2020/08/31 Python
Python中的特殊方法以及应用详解
2020/09/20 Python
ivx平台开发之不用代码实现一个九宫格抽奖功能
2021/01/27 HTML / CSS
世界上最大的巴士旅游观光公司:Big Bus Tours
2016/10/20 全球购物
美国浴缸、水槽和水龙头购物网站:Vintage Tub & Bath
2019/11/05 全球购物
护理学毕业生求职信
2013/11/14 职场文书
申请任职学生会干部自荐书范文
2014/02/13 职场文书
中秋节主持词
2014/04/02 职场文书
学习雷锋标语
2014/06/25 职场文书
淘宝活动总结范文
2014/06/26 职场文书
党的群众路线对照检查材料
2014/08/27 职场文书
党政领导班子群众路线对照检查材料思想汇报
2014/09/27 职场文书
2014年镇党建工作汇报材料
2014/11/02 职场文书
2015年社会治安综合治理工作总结
2015/04/10 职场文书
关于应聘教师的自荐信
2016/01/28 职场文书
《抽屉原理》教学反思
2016/02/20 职场文书
个人的事迹材料怎么写
2019/04/24 职场文书
导游词之杭州西湖
2019/09/19 职场文书
深入解读Java三大集合之map list set的用法
2021/11/11 Java/Android
Golang使用Panic与Recover进行错误捕获
2022/03/22 Golang