PHP框架实现WebSocket在线聊天通讯系统

2025-05-29 0 27

ThinkPHP使用Swoole需要安装 think-swoole Composer包,前提系统已经安装好了Swoole PECL 拓展

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

composer require topthink/think-swoole

话不多说,直接上代码:

新建WebSocket.php控制器:

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57
<?php

namespace apphomecontroller;

use thinkswooleServer;

class WebSocket extends Server

{

protected $host = '0.0.0.0'; //监听所有地址

protected $port = 9501; //监听9501端口

protected $serverType = 'socket';

protected $option = [

'worker_num'=> 4, //设置启动的Worker进程数

'daemonize' => false, //守护进程化(上线改为true)

'backlog' => 128, //Listen队列长度

'dispatch_mode' => 2, //固定模式,保证同一个连接发来的数据只会被同一个worker处理

//心跳检测:每60秒遍历所有连接,强制关闭10分钟内没有向服务器发送任何数据的连接

'heartbeat_check_interval' => 60,

'heartbeat_idle_time' => 600

];

//建立连接时回调函数

public function onOpen($server,$req)

{

$fd = $req->fd;//客户端标识

$uid = $req->get['uid'];//客户端传递的用户id

$token = $req->get['token'];//客户端传递的用户登录token

//省略token验证逻辑......

if (!$token) {

$arr = array('status'=>2,'message'=>'token已过期');

$server->push($fd, json_encode($arr));

$server->close($fd);

return;

}

//省略给用户绑定fd逻辑......

echo "用户{$uid}建立了连接,标识为{$fd} ";

}

//接收数据时回调函数

public function onMessage($server,$frame)

{

$fd = $frame->fd;

$message = $frame->data;

//省略通过fd查询用户uid逻辑......

$uid = 666;

$data['uid'] = $uid;

$data['message'] = '用户'.$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));

}

}

//连接关闭时回调函数

public function onClose($server,$fd)

{

echo "标识{$fd}关闭了连接 ";

}

}

前端演示页面:

(省略控制器判断登录状态、分配数据逻辑……)

  1. <!DOCTYPEhtml>
  2. <htmllang="en">
  3. <head>
  4. <metacharset="UTF-8"/>
  5. <metahttp-equiv="X-UA-Compatible"content="IE=edge,chrome=1"/>
  6. <metaname="viewport"content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"/>
  7. <title>Chat</title>
  8. <linkrel="stylesheet"type="text/css"href="/static/liaotian/chat.css"rel="externalnofollow"/>
  9. <scriptsrc="/static/liaotian/js/jquery.min.js"></script>
  10. <scriptsrc="/static/liaotian/js/flexible.js"></script>
  11. </head>
  12. <body>
  13. <headerclass="header">
  14. <aclass="back"href="javascript:history.back()"rel="externalnofollow"></a>
  15. <h5class="tit">在线聊天</h5>
  16. <ahref=""><divclass="rel="externalnofollow"right">退出</div></a>
  17. </header>
  18. <!–聊天内容start–>
  19. <divclass="message"></div>
  20. <!–聊天内容end–>
  21. <!–底部start–>
  22. <divclass="footer">
  23. <imgid="setbtn"src="/static/liaotian/images/hua.png"alt=""/>
  24. <imgsrc="/static/liaotian/images/xiaolian.png"alt=""/>
  25. <inputtype="text"id="msg"value=""maxlength="300">
  26. <pstyle="background:rgb(17,79,142);"id="sendBtn">发送</p>
  27. </div>
  28. <!–底部end–>
  29. </body>
  30. </html>
  31. <scriptsrc="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
  32. <scriptsrc="https://cdn.bootcss.com/layer/3.1.0/layer.js"></script>
  33. <scripttype="text/javascript">
  34. $(function(){
  35. varuid=666;//当前用户id
  36. vartoken='abcdefg';//用户token
  37. //判断浏览器是否支持WebSocket
  38. varsupportsWebSockets='WebSocket'inwindow||'MozWebSocket'inwindow;
  39. if(supportsWebSockets){
  40. //建立WebSocket连接(ip地址换成自己主机ip)
  41. varws=newWebSocket("ws://127.0.0.1:9501?uid="+uid+"&token="+token);
  42. ws.onopen=function(){
  43. layer.msg('服务器连接成功',{shade:0.1,icon:1,time:600});
  44. };
  45. ws.onerror=function(){
  46. layer.msg('服务器连接失败',{shade:0.1,icon:2,time:600});
  47. };
  48. ws.onmessage=function(evt){
  49. vardata=$.parseJSON(evt.data);
  50. //错误提示
  51. if(data.status!=1){
  52. layer.alert(data.message,{icon:2});
  53. return;
  54. }
  55. //消息返回
  56. if(data.status==1&&data.data.message!=''){
  57. varhtml="";
  58. if(data.data.uid==uid){
  59. html+="<divstyle='word-break:break-all'class="show"><divclass="time">"+data.data.post_time+"</div><divclass="msg"><imgsrc=""+data.data.head_img+""alt=""/><p><iclas="msg_input"></i>"+data.data.message+"</p></div></div>";
  60. }else{
  61. html+="<divstyle='word-break:break-all'class="send"><divclass="time">"+data.data.post_time+"</div><divclass="msg"><imgsrc=""+data.data.head_img+""alt=""/><p><iclas="msg_input"></i>"+data.data.message+"</p></div></div>";
  62. }
  63. }
  64. $(".message").append(html);
  65. setTimeout(function(){
  66. ($('.message').children("div:last-child")[0]).scrollIntoView();//向上滚动
  67. },100);
  68. };
  69. ws.onclose=function(res){
  70. };
  71. //按钮发送
  72. $("#sendBtn").click(function(){
  73. varcontents=$("#msg").val().trim();
  74. if(contents==null||contents==""){
  75. layer.msg('内容为空',{shade:0.1,icon:2,time:600});
  76. returnfalse;
  77. }else{
  78. ws.send(contents);
  79. $("#msg").val("");
  80. }
  81. });
  82. //回车发送
  83. $("#msg").keydown(function(evel){
  84. varthat=$(this);
  85. if(evel.keyCode==13){
  86. evel.cancelBubble=true;
  87. evel.preventDefault();
  88. evel.stopPropagation();
  89. varcontents=that.val().trim();
  90. if(contents==null||contents==""){
  91. layer.msg('内容为空',{shade:0.1,icon:2,time:600});
  92. returnfalse;
  93. }else{
  94. ws.send(contents);
  95. that.val("");
  96. }
  97. }
  98. });
  99. }else{
  100. layer.alert("您的浏览器不支持WebSocket!");
  101. }
  102. });
  103. </script>

服务器移到项目根目录开启服务:

php public/index.php Websocket/start

这里的路径,是因为我绑定了home模块为默认模块,tp5默认情况是:php public/index.php index/Websocket/start)

开启成功,查看端口已经被监听:

lsof -i:9501

很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要请戳这里

总结

以上所述是小编给大家介绍的PHP框架实现WebSocket在线聊天通讯系统,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对快网idc网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

原文链接:https://segmentfault.com/a/1190000021064910

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 PHP框架实现WebSocket在线聊天通讯系统 https://www.kuaiidc.com/91838.html

相关文章

发表评论
暂无评论