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函数utf8转gb2312编码
Dec 21 PHP
隐藏你的.php文件的实现方法
Mar 19 PHP
PHP及Zend Engine的线程安全模型分析
Nov 10 PHP
php中判断文件空目录是否有读写权限的函数代码
Aug 07 PHP
php cookie中点号(句号)自动转为下划线问题
Oct 21 PHP
javascript+php实现根据用户时区显示当地时间的方法
Mar 11 PHP
php关键字仅替换一次的实现函数
Oct 29 PHP
PHP加密解密类实例代码
Jul 20 PHP
php微信公众平台开发之微信群发信息
Sep 13 PHP
PHP批量修改文件名称的方法分析
Feb 27 PHP
PHP面向对象程序设计(OOP)之方法重写(override)操作示例
Dec 21 PHP
php基于协程实现异步的方法分析
Jul 17 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
thinkphp多层MVC用法分析
2015/12/30 PHP
如何解决PHP使用mysql_query查询超大结果集超内存问题
2016/03/14 PHP
PHP面向对象程序设计内置标准类,普通数据类型转为对象类型示例
2019/06/12 PHP
PHP常用的类封装小结【4个工具类】
2019/06/28 PHP
JavaScript 字符编码规则
2009/05/04 Javascript
js 关键词高亮(根据ID/tag高亮关键字)案例介绍
2013/01/21 Javascript
jquery使用jxl插件导出excel示例
2014/04/14 Javascript
Extjs的FileUploadField文件上传出现了两个上传按钮
2014/04/29 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
JS实现的4种数字千位符格式化方法分享
2015/03/02 Javascript
jQuery实现下拉菜单(内容为时间)的实时更新及图表的随动更新的方法
2016/07/07 Javascript
9个让JavaScript调试更简单的Console命令
2016/11/14 Javascript
javascript中的相等操作符(==与===区别)
2019/12/21 Javascript
JS实现动态无缝轮播
2020/01/11 Javascript
koa2 数据api中间件设计模型的实现方法
2020/07/13 Javascript
使用Python发送各种形式的邮件的方法汇总
2015/11/09 Python
Python引用模块和查找模块路径
2016/03/17 Python
对python字典元素的添加与修改方法详解
2018/07/06 Python
在pandas多重索引multiIndex中选定指定索引的行方法
2018/11/16 Python
python配置grpc环境
2019/01/01 Python
python对文件目录的操作方法实例总结
2019/06/24 Python
pyqt5 lineEdit设置密码隐藏,删除lineEdit已输入的内容等属性方法
2019/06/24 Python
python logging模块的使用总结
2019/07/09 Python
详解Python中的各种转义符\n\r\t
2019/07/10 Python
python之pymysql模块简单应用示例代码
2019/12/16 Python
python列表推导和生成器表达式知识点总结
2020/01/10 Python
pytorch 中的重要模块化接口nn.Module的使用
2020/04/02 Python
Python如何使用队列方式实现多线程爬虫
2020/05/12 Python
使用CSS3和Checkbox实现JQuery的一些效果
2015/08/03 HTML / CSS
html5的localstorage详解
2017/05/09 HTML / CSS
德国大型和小型家用电器网上商店:Energeto
2019/05/15 全球购物
党员承诺践诺书
2014/05/20 职场文书
党员弘扬焦裕禄精神思想汇报
2014/09/10 职场文书
离婚协议书的书写要求
2014/09/17 职场文书
2015年社区矫正工作总结
2015/04/21 职场文书
分享Python异步爬取知乎热榜
2022/04/12 Python