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 COOKIE设置为浏览器进程
Jun 21 PHP
PHP中的函数-- foreach()的用法详解
Jun 24 PHP
PHP执行Curl时报错提示CURL ERROR: Recv failure: Connection reset by peer的解决方法
Jun 26 PHP
使用PHP如何实现高效安全的ftp服务器(一)
Dec 20 PHP
PHP和MySql中32位和64位的整形范围是多少
Feb 18 PHP
PHP中Restful api 错误提示返回值实现思路
Apr 12 PHP
屏蔽PHP默认设置中的Notice警告的方法
May 20 PHP
Yii视图CGridView列表用法实例分析
Jul 12 PHP
PHP 进度条函数的简单实例
Sep 19 PHP
PHP数组遍历的几种常见方式总结
Feb 15 PHP
使用ucenter实现多站点同步登录的讲解
Mar 21 PHP
PHP数据源架构模式之表入口模式实例分析
Jan 23 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
在线增减.htpasswd内的用户
2006/10/09 PHP
js控制div及网页相关属性的代码
2009/12/19 Javascript
探讨js中的双感叹号判断
2013/11/11 Javascript
javascript类型转换使用方法
2014/02/08 Javascript
Javascript控制input输入时间格式的方法
2015/01/28 Javascript
jQuery实现鼠标经过提示信息的地图热点效果
2015/04/26 Javascript
在Node.js中使用HTTP上传文件的方法
2015/06/23 Javascript
第七章之菜单按钮图标组件
2016/04/25 Javascript
js实现动态创建的元素绑定事件
2016/07/19 Javascript
jquery表格datatables实例解析 直接加载和延迟加载
2016/08/12 Javascript
AngularJS  ng-table插件设置排序
2016/09/21 Javascript
BootStrap的select2既可以查询又可以输入的实现代码
2017/02/17 Javascript
xmlplus组件设计系列之路由(ViewStack)(7)
2017/05/02 Javascript
vue 动态改变静态图片以及请求网络图片的实现方法
2018/02/07 Javascript
vue配置请求本地json数据的方法
2018/04/11 Javascript
vue 组件中添加样式不生效的解决方法
2018/07/06 Javascript
小程序如何构建骨架屏
2019/05/29 Javascript
用 js 写一个 js 解释器过程详解
2019/08/02 Javascript
vue-cli3使用mock数据的方法分析
2020/03/16 Javascript
Vue 请求传公共参数的操作
2020/07/31 Javascript
vue elementui tree 任意级别拖拽功能代码
2020/08/31 Javascript
vue的hash值原理也是table切换实例代码
2020/12/14 Vue.js
Python中shutil模块的学习笔记教程
2017/04/04 Python
python机器学习之神经网络实现
2018/10/13 Python
浅谈Django中的QueryDict元素为数组的坑
2020/03/31 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
2020/06/14 Python
python开发一款翻译工具
2020/10/10 Python
J.Crew官网:美国知名休闲服装品牌
2017/05/19 全球购物
Hotels.com拉丁美洲:从豪华酒店到经济型酒店的预定优惠和折扣
2019/12/09 全球购物
元旦晚会主持词
2014/03/24 职场文书
合伙经营协议书
2014/04/18 职场文书
企业2014年度工作总结
2014/12/10 职场文书
志愿者事迹材料
2014/12/26 职场文书
css 中多种边框的实现小窍门
2021/04/07 HTML / CSS
Mysql官方性能测试工具mysqlslap的使用简介
2021/05/21 MySQL
解决vue中provide inject的响应式监听
2022/04/19 Vue.js