针对课程:getwayworker长连接下的普通文本消息之聊天记录持久化
https://study.163.com/course/courseLearn.htm?courseId=1005015012#/learn/video?lessonId=1051351979&courseId=1005015012
1.判断用户是否在线
在events.php中:
public static function onMessage($client_id, $message){
$message_data = json_decode($message,true);//把json数据转换成数组
//判断msg数据是否存在
if(!$message_data){
return;
}
switch($message_data['type']){
case "bind":
$fromid = $message_data['fromid'];
Gateway::bindUid($client_id,$fromid);//客户端id与fromid绑定
retrun;
case "say":
var text =nl2br(htmlspecialchars($message_data['data']));
var fromid = $message_data['fromid'];
var toid = $message_data['toid'];
//组装一套要发送给客户端的数据:
$data = [
'type'=>'text',
'id'=>$client_id,//可选
'data'=>$text,
'from'=>$fromid,
'toid' =>$toid,
'time'=>time()
];
//判断用户的在线情况:
if(Gateway::isUidOnline($toid)){
Gateway::sendToUid($toid,json_encode($data));//将已组装好的数据,发送给已绑定的uid客户端,将数组转换成json发给客户端
$data['isread']=1;
}else{
$data['isread']=0;
}
$data['type']="save";
Gateway::sendToUid($fromid,json_encode($data));
retrun;
}
}
前端页面:
客户端接收到events.php发送过来的数据,进行处理:
var fromid = {$fromid};
var toid = {$toid};
var API_URL = "/api/chat/";
ws.onmessage = function(e){
var message = eval("("+e.data+")"); //将客户端收到的json转换成js数据
switch(message.type){
case "init":
var bind = '{"type":'bind',"fromid":"'+fromid+'"}';
ws.send(bind);
ruturn;
case "text":
if(toid==message.fromid){
$(".chat-content").append('<div>'+message.data+'</div>');
}
retrun;
case "save":
save_message(message);
return;
}
}
function save_message(message){
$.post(
API_URL+"save_message",
message,
function(){},'json'
)
}
API模块下,Chat控制器:
namespace app\api\controller;
class Chat extends Controller{
/*文本消息的数据持久化*/
public function save_message(){
if(Request::instance()->isAjax()){
$message = input("post.");
$datas['fromid'] = $message['fromid'];
$datas['fromname'] =$this->getName($datas['fromid']) ;
$datas['toid'] = $message['toid'];
$datas['toname'] =$this->getName($datas['toid']) ;
$datas['content'] = $message['data'];
$datas['time'] = $message['time'];
$datas['isread'] = $message['isread'];
$datas['type'] = 1 ;//文本为1,图片为2
Db::name("communication")->insert($datas);
}
}
/*根据用户id,返回用户的姓名*/
public function getName($uid){
$userinfo = Db::name("user")->where('id',$uid)->field('nickname')->find();
return $userinfo['nickname'];
}
}