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 相关文章推荐
使用adodb lite解决问题
Dec 31 PHP
Zend的MVC机制使用分析(一)
May 02 PHP
深入PHP与浏览器缓存的分析
Jun 03 PHP
腾讯QQ微博API接口获取微博内容
Oct 30 PHP
CodeIgniter实现更改view文件夹路径的方法
Jul 04 PHP
php CI框架插入一条或多条sql记录示例
Jul 29 PHP
php对二维数组进行相关操作(排序、转换、去空白等)
Nov 04 PHP
PHP语法小结之基础和变量
Nov 22 PHP
php 从指定数字中获取随机组合的简单方法(推荐)
Apr 05 PHP
PHP框架laravel的.env文件配置教程
Jun 07 PHP
Thinkphp结合AJAX长轮询实现PC与APP推送详解
Jul 31 PHP
PHP 模拟登陆功能实例详解
Sep 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 网络开发详解之远程文件包含漏洞
2010/04/25 PHP
允许phpmyadmin空密码登录的配置方法
2011/05/29 PHP
PHP+jQuery 注册模块的改进(三):更新到Smarty3.1
2014/10/14 PHP
php数值计算num类简单操作示例
2020/05/15 PHP
基于jquery的修改当前TAB显示标题的代码
2010/12/11 Javascript
JS声明变量背后的编译原理剖析
2012/12/28 Javascript
JS this作用域以及GET传输值过长的问题解决方法
2013/08/06 Javascript
Javascript改变CSS样式(局部和全局)
2013/12/18 Javascript
js操作IE浏览器弹出浏览文件夹可以返回目录路径
2014/07/14 Javascript
Nodejs实现的一个静态服务器实例
2014/12/06 NodeJs
jQuery中clearQueue()方法用法实例
2014/12/29 Javascript
js简单实现竖向tab选项卡的方法
2015/05/04 Javascript
JavaScript中reduce()方法的使用详解
2015/06/09 Javascript
深入分析jsonp协议原理
2015/09/26 Javascript
深入剖析JavaScript中的函数currying柯里化
2016/04/29 Javascript
Three.js学习之文字形状及自定义形状
2016/08/01 Javascript
View.post() 不靠谱的地方你知道多少
2017/08/29 Javascript
浅谈React中组件间抽象
2018/01/27 Javascript
jquery-ui 进度条功能示例【测试可用】
2019/07/25 jQuery
vue-以文件流-blob-的形式-下载-导出文件操作
2020/08/07 Javascript
python多重继承新算法C3介绍
2014/09/28 Python
Python基础入门之seed()方法的使用
2015/05/15 Python
Python读取图片属性信息的实现方法
2016/09/11 Python
Python使用time模块实现指定时间触发器示例
2017/05/18 Python
python中退出多层循环的方法
2018/11/27 Python
Python PyCharm如何进行断点调试
2019/07/05 Python
Python Process多进程实现过程
2019/10/22 Python
python获取整个网页源码的方法
2020/08/03 Python
CSS3实现可爱的小黄人动画
2016/07/11 HTML / CSS
大学生自我评价怎样写好
2013/10/23 职场文书
应届毕业生求职信范文
2013/12/18 职场文书
财务审计整改报告
2014/11/06 职场文书
教师党员自我评价范文
2015/03/04 职场文书
2015年人事专员工作总结
2015/04/29 职场文书
地球上的星星观后感
2015/06/02 职场文书
培训计划通知
2015/07/15 职场文书