手机版

基于ThinkPHP5.0框架和Swoole开发的WebSocket在线聊天案例详解

时间:2021-08-26 来源:互联网 编辑:宝哥软件园 浏览:

本文描述了一个基于ThinkPHP5.0框架和Swoole开发的WebSocket在线聊天的案例。分享给大家参考,如下:

ThinkPHP在使用swole时需要安装think-swoole Composer包,前提是系统中已经安装了swoole PECL扩展(相关文章:Swoole扩展用于在Linux下安装源代码包)

在tp5的项目根目录中执行composer命令来安装think-swoole:

作曲家需要思考

安装成功:

话不多说,直接打码:

创建新的WebSocket.php控制器:

(监听端口需要确认服务器的释放,宝塔环境也需要添加安全组规则)

?phpnamespace app \ home \ controller;使用think \ swoole \ Server类WebSocket扩展了Server { protected $ host=' 0 . 0 . 0 . 0 ';//侦听所有受保护的地址$ port=9501//监视器端口9501受保护$ ServerType=“socket”;Protected $//心跳检测:每60秒遍历一次所有连接,在10分钟内强制关闭未向服务器发送任何数据的连接' heartbeat _ check _ interval'=60,' heart beat _ idle _ time '=600];//建立连接时回调open ($ server,$ req) {$ FD=$ req-FD上的函数public function//客户端id $ uid=$ req-get[' uid '];//客户端传递的用户ID为$ token=$ req-get[' token '];//客户端传递的用户登录令牌//省略令牌验证逻辑.if(!$ token) {$ arr=array ('status'=2,' message'=' token已过期');$server-push($fd,JSON _ encode($ arr));$ server-close($ FD);返回;}//省略对用户的绑定fd逻辑.echo“用户{$uid}已建立连接,该连接标记为{ $ FD } \ n”;}//回叫消息上的函数公共函数($ server,$ frame) {$ FD=$ frame-FD接收数据时;$ message=$ frame-data;//省略通过fd查询用户uid的逻辑.$ uid=666$ data[' uid ']=$ uid;$data['message']=' user '。$uid。发送了:’。$ message$ data[' post _ time ']=date(' m/d h : I ',time());$arr=array('status'=1,' message'='success ',' data '=$ data);//只推送给当前连接的用户//$ server-push ($ FD,JSON _ encode($ arr));//推送给所有连接的用户foreach($ server-connections as $ FD){ $ server-Push($ FD,JSON _ encode($ arr));} }//回调函数公共函数onclose ($ server,$ FD) {echo '表示{$fd}关闭了连接\ n ';}}前端演示页面:

(省略了控制器判断登录状态和分发数据的逻辑.)

!DOCTYPE html html lang=' en ' hearta charset=' UTF-8 '/meta http-equiv=' X-UA-Compatible ' content=' IE=edge,chrome=1 '/meta name=' viewport ' content=' width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scale=no '/title chat/title link rel='样式表type=' text/CSS ' href='/static/liotian/chat。CSS ' rel='外部否在线聊天/H5 a href=' div class=' rel='外部no跟随' right '退出/div/a/表头!-聊天内容start - div class='message' /div!-聊天内容结束了。-底部start-div class=' footer ' img id=' setbtn ' src=' http :/static/liaotian/images/Hua。png ' alt=' '/img src=' http :/static/liaotian/images/连笑。png ' alt=' '/input type=' text ' id=' msg ' value=' maxlength=' 300 ' p style=' background : RGB(17,79,142);id='sendBtn '发送/p /div!-底部end-/body/html脚本src=' http :http://apps。bdimg。com/libs/jquery/2。1 .4/jquery。量滴js '/script script src=' http :https://cdn。布斯。com/layer/3。1 .0/层。js '/script脚本类型=' text/JavaScript ' $(function(){ var uid=666;//当前用户id var token=' abcdefg//用户token //判断浏览器是否支持web socket var supportsWebSockets=' web socket '在窗口|| 'MozWebSocket '在窗户;if (supportsWebSockets) { //建立WebSocket连接(ip地址换成自己主机IP)var ws=new WebSocket(' ws ://127。0 .0 .1:9501?uid=' uid ' token=' token);ws.onopen=function () { layer.msg('服务器连接成功,{shade:0.1,icon:1,time :600 });};ws。onerror=function(){ layer。“msg(”服务器连接失败,{shade:0.1,icon:2,time :600 });};ws。on message=function(evt){ var data=$ .parseJSON(evt。数据);//错误提示if(data.status!=1){ layer.alert(data.message,{ icon :2 });返回;} //消息返回if(数据。状态==1数据。数据。留言!=' '){ var html=' ';if(数据。数据。uid==uid){ html=' div style=' word-break : break-all ' class=\ ' show ' div class=\ ' time \ ' } else { html=' div style=' word-break : break-all ' class=\ ' send ' div class=\ ' time '数据。数据。post _ time '/div div class=\ ' msg ' img src=\ ' data。数据。head _ img ' \ ' alt=\ ' \ '/pi class=\ ' msg _ input \ '/I '数据。数据。消息'/p/div/div ';} } $('.消息')。追加(html);setTimeout(函数(){ ($()。消息')。子代(' div : last-child ')[0]).scrollIntoView();//向上滚动},100);};ws。onclose=function(RES){ };//按钮发送$('#sendBtn ').单击(函数(){ var contents=$('#msg ')).val().trim();if(内容==null | |内容==' '){ layer。“msg(”内容为空,{shade:0.1,icon:2,time :600 });返回false} else { ws。发送(内容);$('#msg ').val(" ");} });//回车发送$('#msg ').向下键(功能(级别){ var那=$(this);if(水平。键码==13){ level。cancelubble=true水平。prevent default();水平。stopperpagation();var contents=that.val().trim();if(内容==null | |内容==' '){ layer。“msg(”内容为空,{shade:0.1,icon:2,time :600 });返回false} else { ws。发送(内容);那个。val(');} } });}else{ layer.alert('您的浏览器不支持WebSocket!');}});/script服务器移到项目根目录开启服务:

phpppublic/index . phpwebsocket/start(这里的路径是因为我把home模块绑定为默认模块,tp5的默认值是phpppublic/index . phpindex/WebSocket/start)

成功打开,检查端口是否已被监控:

lsof-I :9501

示范效果如下:

服务器监控如下:

每次用户刷新和重新连接时,fd标识都会改变。

更多对thinkPHP感兴趣的读者可以查看本网站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend FrameWork框架入门教程》、《PHP模板技术总结》、0103010。

希望本文对基于ThinkPHP框架的PHP编程有所帮助。

版权声明:基于ThinkPHP5.0框架和Swoole开发的WebSocket在线聊天案例详解是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。