采用PHP实现”服务器推”技术的聊天室
本文将通过结合Ticks(可以参看我的另外一篇文章:关于PHP你可能不知道的-PHP的事件驱动化设计),来实现一个服务器推的PHP聊天室简单构想。
PHPer,尤其是用过set_cookie, header的,一定见过这样的提示信息:”Warning: Cannot modify header information – headers already sent by…..”, 这是因为通过HTTP协议通信,数据包会包含俩个部分,一个是Header,一个是data。一般来说,都是先Header部分,在Heaer部分指明了 Data部分的长度,然后使用\r\n\r\n来表示header部分结束,接下来是Data部分。
当我们有任何输出的时候,Header部分就发送了,这个时候,你再想header函数来改变一些Header部分的域信息,就会得到上面的提示信息。
一个简单的办法就是使用output_buffering。让它来缓存服务器的输出,不要太早将Header部分发给客户端。
那么,如果不使用output_buffering,是不是就可以实现,每当服务器有输出,就立即发送给客户端呢?
做个如下试验:
//设置php.ini中output_buffering=0 或者使用ob_end_flush()关闭缓存
- set_time_limit(0);for($i=0;$i<10;$i++){echo "Now Index is :". $i;sleep(1);}
结果我们发现,还是要等到脚本全部执行完以后,才能一次看到所有的结果。。
为什么呢?
这是因为我们只是解决了缓存问题,但是还有一个缓冲问题,PHP会缓冲程序的输出。所以,这个时候,我们还需要调用,flush(), 来强制使得PHP将所有的程序输出发送给客户端。
- set_time_limit(0);//设置php.ini中output_buffering=0ob_end_flush();//关闭缓存set_time_limit(0);for($i=0;$i<10;$i++){echo "Now Index is :". $i;flush();sleep(1);}
现在是不是看到了,不断有服务器的数据显示出来(如果看不到, 可以在输出前填充相当数量的占位字符)?
有几个概念之间的关系,我这里补充以下:
在代码中使用ob_start(), 就相当于在php.ini中使用output_buffering=on一样,使用服务器缓存。
在代码中使用ob_end_flush() 就相当于在php.ini中使用output_buffering = false一样,关闭服务器缓存.
基于前面的讨论,我们就有可能使用Ticks来实现,一个无刷新,无ajax的聊天室: 页面中包含俩个iframe,一个是不断获取聊天室的聊天内容,一个包含用户发表聊天内容的form. 这样,在第一个frame的脚本中:
- ob_end_clean();//关闭缓存
- set_time_limit(0);ob_implicit_flush(); //这个语句将强制每当有输出就自动刷新,相当于在每个echo后,调用ob_flush()$new_mesg = NULL;register_tick_function("getNewMesg");declare(ticks=1){while(1){if(!is_null($new_mesg)){foreach($new_mesg as $msg){echo $msg;}$new_mesg = null;}}}function getNewMesg(){//通过查询数据库,或者共享内存,来获取现在的聊天室大厅的内容。//返回一个数组,包含所有的新的聊天内容}
这样就实现了一个简单的使用服务器推技术的聊天室的框架。
当然,关于实时输出,还有一些其他的限制,比如在PHP5手册中讲到的:
个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。
有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。
甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape 浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到
标记之前,不会显示出整个表格。
一些版本的 Microsoft Internet Explorer 只有当接受到的256(甚至更多)个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。
接下来,我贴一个很有趣的代码,有兴趣的同学,可以试试:
- header("Content-type: multipart/x-mixed-replace;boundary=endofsection");print "--endofsection\n";$pmt = array("-", "\\", "|", "/" );for( $i = 0; $i <10;$i ++ ){sleep(1);print "Content-type: text/plain\n\n";print "Part $i ".$pmt[$i % 4];print "--endofsection\n";ob_flush(); //强制将缓存区的内容输出flush(); //强制将缓冲区的内容发送给客户端}print "Content-type: text/plain\n\n";print "The end\n";print "–endofsection–\n";
使用firefox打开,看看你看到了什么。
转载于:https://www.cnblogs.com/wwlww/p/8413327.html
采用PHP实现”服务器推”技术的聊天室相关推荐
- Comet:基于 HTTP 长连接的“服务器推”技术 (实例)
"服务器推"技术的应用 传统模式的 Web 系统以客户端发出请求.服务器端响应的方式工作.这种方式并不能满足很多现实应用的需求,譬如: 1. 监控系统:后台硬件热插拔.LED.温度 ...
- Comet:基于HTTP长连接的“服务器推”技术
作者:周 婷 (zhouting@cn.ibm.com), 软件工程师, IBM 中国软件开发技术实验室 来源:http://www.ibm.com/developerworks/cn/web/wa- ...
- [转载] Comet:基于 HTTP 长连接的“服务器推”技术
转载自http://www.ibm.com/developerworks/cn/web/wa-lo-comet/ "服务器推"技术的应用 传统模式的 Web 系统以客户端发出请求. ...
- comet - “服务器推”技术
概念 comet :基于 HTTP 长连接的"服务器推"技术,是一种新的 Web 应用架构.基于这种架构开发的应用中,服务器端会主动以异步的方式向 客户端程序推送数据,而不需要客户 ...
- 基于php和服务器推技术的web即时聊天系统,基于php和服务器推技术的Web即时聊天系统...
基于php和服务器推技术的Web即时聊天系统① 王振兴, 黄静 [摘要]摘要: 基于http协议应用于Web端, 实现一个浏览器无关的.便于移植的.高性能的Web即时聊天系统. 系统使用服务器推技术中 ...
- Comet:基于 HTTP 长连接的“服务器推”技术解析
一.背景介绍 传统web请求,是显式的向服务器发送http Request,拿到Response后显示在浏览器页面上.这种被动的交互方式不能满足对信息实时性要求高的应用,譬如聊天室.股票交易行情.在线 ...
- Pushlet和Dwr的简单服务器推技术
附件里Pushlet和Dwr3.0的简单服务器推技术. DWR-Source.rar为DWR的学习资料. 下面简单介绍一下dwr3.0 RC2版本的反推技术代码. 首先下载dwr官方包,笔者这里下载的 ...
- pushlet实现服务器推技术
服务器推技术: (1)由于目前我司电话系统处理来电弹屏存在一个问题,就是客户端登录系统会触发前端js不断去请求数据库数据,并反馈给前端,如果使用者一多,将会导致系统资源高消耗: (2)目前比较成 ...
- php聊天室技术,PHP聊天室技术
PHP聊天室技术推荐查看本文HTML版本 1.前言 上网聊天是时下最流行的交友方式.各大网站推出的聊天室都各具特色. 聊天室主要分为WebChat.BBSChat两种.BBSChat是基于Teln ...
最新文章
- Exchange管理控制台无法安装,要求重新启动
- 【读书笔记《Android游戏编程之从零开始》】17.游戏开发基础(游戏适屏的简述和作用、让游戏主角动起来)...
- 澳大利亚研究者研制出一种计算机芯片 他们,快讯:几乎看不见的3D打印机器人;西澳大利亚大学的研究人员开发出一种保护生态机器鱼;效率达CPU一万倍的神经形态芯片发布!...
- vue基础整理-组件
- Android 实现简单的插件化模块化
- 学习手记(2019/7/05~2019/8/31)——快乐暑假
- 互联网晚报 | 1月29日 星期六 | 支付宝相互宝正式关停;大钲资本成瑞幸咖啡实控人;苹果创有史以来最高单季营收...
- 基于tcp的网络程序_【CVPR 2020 Tutorial】基于神经网络的符号化视觉推理和程序合成(2)...
- python如何移动图片_Pygame的图像移动|python基础教程|python入门|python教程
- 软件汉化工具:eXeScope
- 直播间搭建项目——延续直播发展趋势
- 2015手机网民超10亿是什么景象?
- 关于安装TOMCAT解压版环境配置流程
- MAC正确简单安装brew
- astype()函数
- 量化投资入门指南:投资组合构建模型和执行模型
- 【三角】和差角公式的证明与积化和差和差化积公式的推导
- html5小球互相碰撞,HTML5相互碰撞散开的小球
- [NOIP2002 普及组] 级数求和
- L1-030. 一帮一-PAT团体程序设计天梯赛GPLT
热门文章
- Tomcat虚拟路径
- C# DataGridView控件用法
- cdh必须要在root用户搭建吗_基于cloudera CDH5的环境搭建
- java ios支付接口开发_微信支付接入(Android/IOS(swift)/Java后台)
- oracle11中过程continue,Oracle 11g OCM备考之创建EM与EM登陆异常的处理
- php 下载脱离服务器,php – 强制从外部服务器下载并重命名
- 添加右键菜单_笔记本没有灭屏键?巧在右键菜单添加“关闭显示器”选项
- HALCON双目标定
- 010-你觉得单元测试可行吗
- webpack4.0--如何安装和配置(一)