SSE(Server-Sent Events):普通阐明起来便是一种基于HTTP的,由做事端持续向客户端发送数据的技能。SSE 无需做事端进行额外支配,SSE 默认支持断线重连,与做事器建立连接后,你乃至不用考虑客户的网络非常情形。
二、Redis 技能特点
Redis性能极高的内存数据库,它读写速率十分惊人。它不仅仅支持大略的key-value类型的数据,同时还供应list,set,zset,hash等数据构造的存储,可以说利用Redis进行特天命据的读取十分方便,本例中利用List数据类型存储通报谈天内容,关于List数据类型的特点,大家可自行理解。

三、大略单纯谈天系统模式概述
从上图中可以看出,系统基本可分为三个紧张部分:
A、数据呈现
这里要支配一些基本的谈天元素,如好友列表、谈天内容的展示、谈天信息的发出(提交至C),同时还卖力与B建立交互连接,可以实时从B获取干系的谈天内容。
B、数据交互
卖力从C通过Redis获取谈天内容,并输出给A。
C、信息存储
卖力吸收A发出的谈天信息并存储至Redis(如有需求,还可存储至数据库)。
四、紧张关键点解析
(1)A与做事器(B)建立SEE连接,并处理获取到的谈天内容
$(document).ready(function(){startSse();//页面初始化完成后直接与做事器建立连接});function startSse(){var Sse = new EventSource('ser.php');Sse.onmessage = function(event){//取得谈天内容var d = JSON.parse(event.data);if(d.length>0){for(var i=0;i<d.length;i++){//读取做事器通报过来的(可能不止一条)var fuid = d[i].fromid;//可根据fuid让相应用户头像闪烁(类似QQ的新提醒)var msg = d[i].msg;$('#info'+fuid).append(msg);//将谈天内容添加到相应的位置}}}Sse.onerror = function(){//缺点处理}}
(2)B从Redis读取数据并输出给A
header('X-Accel-Buffering: no');header('Content-Type: text/event-stream');header('Cache-Control: no-cache');ob_end_clean(); ob_implicit_flush(1); $uid = 'laoli';//建议通过session或cookies获取当前用户的uidinclude('redis.php');$redis = new myredis;while(1){//开启一个无限循环,持续向客户端输出 if(connection_aborted()){//客户挂掉连接后(如关闭页面)退出循环,开释资源break; }else{//$msgDate = array();while($msg = $redis->rpop('chat_'.$uid)){ //从Redis,List表中取出谈天内容,把稳list表的命名是和用户ID关联的, //$redis->rpop倒序取出并剔除,因此这个循环是可以全部取出与当前用户干系的谈天内容,同时清空该用户的List表 $msgDate[] = json_decode($msg,true);//将取出的一条,转为数组}//echoUserMsg($msgDate);//输出给客户端 sleep(3);}}function echoUserMsg($msgData){//拼接输出内容$msgDataToJson = json_encode($msgData);//拼接输出,关于SEE的输出规则,可自行理解 $str = "id:{0}".PHP_EOL; $str .= "retry: {1000}".PHP_EOL; $str .= "data: {$msgDataToJson}".PHP_EOL; $str .= PHP_EOL; echo $str;}
(3)C取得A发出的谈天内容,存储至Redis。
//$myuid(发送者id),$tuid(吸收者id),$msg(谈天内容)//上面三项基本数据可以通过Session及A提交(Post)得到//构建一笔记载,包括上述三项基本要素$msgArr = array('fromid'=>$myuid,'touid'=>$tuid,'msg'=>$msg);//存入缓存$redis = new myredis;$redis->lpush('chat_'.$tuid,json_encode($msgArr));//将记录存储至Redis,List表中,存储格式是json字符串//把稳List表的命名跟吸收者的ID关联unset($redis);//如有需求,下面可进一步将谈天内容存入数据库-------