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 相关文章推荐
一个连接两个不同MYSQL数据库的PHP程序
Oct 09 PHP
PHP文件上传实例详解!!!
Jan 02 PHP
用php获取本周,上周,本月,上月,本季度日期的代码
Aug 05 PHP
php采用file_get_contents代替使用curl实例
Nov 07 PHP
PHP处理大量表单字段的便捷方法
Feb 07 PHP
PHP调用.NET的WebService 简单实例
Mar 27 PHP
php使用substr()和strpos()联合查找字符串中某一特定字符的方法
May 12 PHP
php中smarty模板条件判断用法实例
Jun 11 PHP
php编写简单的文章发布程序
Jun 18 PHP
WordPress中Gravatar头像缓存到本地及相关优化的技巧
Dec 19 PHP
Laravel5.5 动态切换多语言的操作方式
Oct 25 PHP
Laravel框架数据库迁移操作实例详解
Apr 06 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中如何使对象可以像数组一样进行foreach循环
2013/08/09 PHP
Drupal7连接多个数据库及常见问题解决
2014/03/02 PHP
Zend Framework动作助手Redirector用法实例详解
2016/03/05 PHP
php 无限分类 树形数据格式化代码
2016/10/11 PHP
Yii框架安装简明教程
2020/05/15 PHP
Kibo 用于处理键盘事件的Javascript工具库
2011/10/28 Javascript
用js正确判断用户名cookie是否存在的方法
2014/01/28 Javascript
jQuery实现div浮动层跟随页面滚动效果
2014/02/11 Javascript
node.js适合游戏后台开发吗?
2014/09/03 Javascript
jQuery判断指定id的对象是否存在的方法
2015/05/22 Javascript
JS实现iframe编辑器光标位置插入内容的方法(兼容IE和Firefox)
2016/06/24 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
2016/09/27 Javascript
jquery插件bootstrapValidator数据验证详解
2016/11/09 Javascript
angular.js 路由及页面传参示例
2017/02/24 Javascript
浅谈vuex 闲置状态重置方案
2018/01/04 Javascript
vuejs项目打包之后的首屏加载优化及打包之后出现的问题
2018/04/01 Javascript
JS实现Cookie读、写、删除操作工具类示例
2018/08/28 Javascript
JS原型与继承操作示例
2019/05/09 Javascript
Vue 利用指令实现禁止反复发送请求的两种方法
2019/09/15 Javascript
解决Vue keep-alive 调用 $destory() 页面不再被缓存的情况
2020/10/30 Javascript
利用Python如何制作贪吃蛇及AI版贪吃蛇详解
2020/08/24 Python
python中time.ctime()实例用法
2021/02/03 Python
Monki官网:斯堪的纳维亚的独立时尚品牌
2020/11/09 全球购物
请编程遍历页面上所有 TextBox 控件并给它赋值为 string.Empty
2015/12/03 面试题
Linux的主要特性
2016/09/03 面试题
软件测试工程师笔试题带答案
2015/03/27 面试题
给水排水工程专业毕业生推荐信
2013/10/28 职场文书
促销活动策划方案
2014/01/12 职场文书
小学生获奖感言范文
2014/02/02 职场文书
优秀党员获奖感言
2014/02/18 职场文书
品质主管岗位职责
2014/03/16 职场文书
大学生入党推荐书范文
2014/05/17 职场文书
应聘会计求职信
2014/06/11 职场文书
奖金申请报告模板
2015/05/15 职场文书
2015年工商所工作总结
2015/05/21 职场文书
2016年寒假学习心得体会
2015/10/09 职场文书