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中使用XML
Oct 09 PHP
无数据库的详细域名查询程序PHP版(5)
Oct 09 PHP
利用php获取服务器时间的实现代码
Jun 07 PHP
解析阿里云ubuntu12.04环境下配置Apache+PHP+PHPmyadmin+MYsql
Jun 26 PHP
PHP学习笔记(二):变量详解
Apr 17 PHP
php递归调用删除数组空值元素的方法
Apr 28 PHP
php获取excel文件数据
Apr 21 PHP
浅谈Laravel中的一个后期静态绑定
Aug 11 PHP
PHP常见加密函数用法示例【crypt与md5】
Jan 27 PHP
Laravel框架模型的创建及模型对数据操作示例
May 07 PHP
PHP大文件切割上传功能实例分析
Jul 01 PHP
Thinkphp5.0框架视图view的循环标签用法示例
Oct 12 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基础学习之变量的使用
2011/06/09 PHP
PHP递归返回值时出现的问题解决办法
2013/02/19 PHP
解析PHP中ob_start()函数的用法
2013/06/24 PHP
Laravel 自定命令以及生成文件的例子
2019/10/23 PHP
通过DOM脚本去设置样式信息
2010/09/19 Javascript
js constructor的实际作用分析
2011/11/15 Javascript
Jquery中使用setInterval和setTimeout的方法
2013/04/08 Javascript
window resize和scroll事件的基本优化思路
2014/04/29 Javascript
一个超简单的jQuery回调函数例子(分享)
2016/08/08 Javascript
Three.js快速入门教程
2016/09/09 Javascript
SelectPage v2.4 发布新增纯下拉列表和关闭分页功能
2017/09/07 Javascript
jQuery中库的引用方法
2018/01/06 jQuery
vue解决一个方法同时发送多个请求的问题
2018/09/25 Javascript
Layui 数据表格批量删除和多条件搜索的实例
2019/09/04 Javascript
Layui点击图片弹框预览的实现方法
2019/09/16 Javascript
Vue 实现复制功能,不需要任何结构内容直接复制方式
2019/11/09 Javascript
JavaScript组合设计模式--改进引入案例分析
2020/05/23 Javascript
Angular8 简单表单验证的实现示例
2020/06/03 Javascript
详解Python中的__init__和__new__
2014/03/12 Python
web.py在模板中输出美元符号的方法
2014/08/26 Python
Python实现根据IP地址和子网掩码算出网段的方法
2015/07/30 Python
python flask实现分页效果
2017/06/27 Python
Python基于Pymssql模块实现连接SQL Server数据库的方法详解
2017/07/20 Python
python开启debug模式的方法
2019/06/27 Python
Python转换itertools.chain对象为数组的方法
2020/02/07 Python
python中for in的用法详解
2020/04/17 Python
Python实现UDP程序通信过程图解
2020/05/15 Python
python Gabor滤波器讲解
2020/10/26 Python
Linux中如何设置Java环境变量(Ubuntu)
2016/07/24 面试题
门卫工作岗位职责
2013/12/17 职场文书
工程承包协议书范本
2014/09/29 职场文书
学校运动会简讯
2015/07/20 职场文书
小学英语新课改心得体会
2016/01/22 职场文书
2019年教师节祝福语精选,给老师送上真诚的祝福
2019/09/09 职场文书
导游词之南迦巴瓦峰
2019/11/19 职场文书
基于python制作简易版学生信息管理系统
2021/04/20 Python