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 相关文章推荐
PHP4之COOKIE支持详解
Oct 09 PHP
10条PHP高级技巧[修正版]
Aug 02 PHP
PHP 第一节 php简介
Apr 28 PHP
解析PHP中intval()等int转换时的意外异常情况
Jun 21 PHP
解析PHP函数array_flip()在重复数组元素删除中的作用
Jun 27 PHP
Yii核心组件AssetManager原理分析
Dec 02 PHP
Laravel 5 框架入门(一)
Apr 09 PHP
详解PHP防止直接访问.php 文件的实现方法
Jul 28 PHP
php处理抢购类功能的高并发请求
Feb 08 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
Feb 11 PHP
php实现微信支付之退款功能
May 30 PHP
Laravel框架处理用户的请求操作详解
Dec 20 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&amp;mysql(三)
2006/10/09 PHP
php读取der格式证书乱码解决方法
2015/06/22 PHP
php抽象类和接口知识点整理总结
2019/08/02 PHP
解决laravel session失效的问题
2019/10/14 PHP
使用正则替换变量
2007/05/05 Javascript
js Math 对象的方法
2013/09/01 Javascript
浅谈checkbox的一些操作(实战经验)
2013/11/20 Javascript
jquery获得option的值和对option进行操作
2013/12/13 Javascript
javascript版的in_array函数(判断数组中是否存在特定值)
2014/05/09 Javascript
JavaScript对HTML DOM使用EventListener进行操作
2015/10/21 Javascript
jquery实现模拟百分比进度条渐变效果代码
2015/10/29 Javascript
javascript实现简易聊天室
2019/07/12 Javascript
VUE 组件转换为微信小程序组件的方法
2019/11/06 Javascript
es6中class类静态方法,静态属性,实例属性,实例方法的理解与应用分析
2020/02/15 Javascript
JavaScript canvas基于数组生成柱状图代码实例
2020/03/06 Javascript
Vue中 axios delete请求参数操作
2020/08/25 Javascript
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
2015/04/24 Python
python strip() 函数和 split() 函数的详解及实例
2017/02/03 Python
使用 Python 实现简单的 switch/case 语句的方法
2018/09/17 Python
python 快速把超大txt文件转存为csv的实例
2018/10/26 Python
pygame游戏之旅 创建游戏窗口界面
2018/11/20 Python
Python实现Event回调机制的方法
2019/02/13 Python
Python使用qrcode二维码库生成二维码方法详解
2020/02/17 Python
python GUI库图形界面开发之PyQt5信号与槽基本操作
2020/02/25 Python
利用python生成照片墙的示例代码
2020/04/09 Python
基于python实现模拟数据结构模型
2020/06/12 Python
如何查看python关键字
2021/01/17 Python
菲律宾旅游网站:Expedia菲律宾
2017/10/11 全球购物
吉力贝官方网站:Jelly Belly
2019/03/11 全球购物
缓刑人员的思想汇报
2014/01/11 职场文书
学校安全教育制度
2014/01/31 职场文书
竞聘演讲稿开场白
2014/08/25 职场文书
2014党员学习兰辉先进事迹思想汇报
2014/09/17 职场文书
祝福语集锦:送给闺蜜的生日祝福语
2019/10/08 职场文书
利用Python判断整数是否是回文数的3种方法总结
2021/07/07 Python
Vue3中toRef与toRefs的区别
2022/03/24 Vue.js