当前位置:   article > 正文

thinkphp6+websocket 群聊实现_thinkphp6 websocket

thinkphp6 websocket

目录

一、安装扩展

二、websocket配置

1.worker_server.php

​编辑

注意事项分享:数据库形式

2.新建控制器Worker(名字随意)

总结


一、安装扩展

cd到项目下进行扩展安装:

composer require topthink/think-worker

扩展安装后根据TP官方提供的文档进行启动

Workerman · ThinkPHP6.0完全开发手册 · 看云

注意事项:扩展安装好后会在 项目根目录 下面新增一个文本文件,用作启动websocket(很方便),测试开启直接双击即可

1.将两行命令加入文本文件

  1. php think worker:server
  2. pause

 2.更改文本文件后缀

Socket.bat

3.扩展安装成功后会在项目config文件下生成两个文件,配置只需要更改worker_server.php

二、websocket配置

1.worker_server.php

  1. 重要的配置要更改这两个地方:
  2. 端口:
  3. 'port' => 2345, //
  4. woker文件:
  5. 'worker_class' => 'app\user\controller\Worker',
  6. 自定义Workerman服务类名(独立的woker控制器路径)

注意事项分享:数据库形式

2.新建控制器Worker(名字随意)

  1. <?php
  2. declare(strict_types=1);
  3. namespace app\user\controller;
  4. use think\worker\Server;
  5. class Worker extends Server
  6. {
  7. /**websocket */
  8. protected $socket = 'websocket://0.0.0.0:2345';
  9. /**定义用户组*/
  10. protected $uidArr = [];
  11. /*
  12. @method 发送消息
  13. @param data 数据
  14. */
  15. public function onMessage($connection, $data)
  16. {
  17. /**对接收消息做json处理*/
  18. $rest = json_decode($data);
  19. /**用户连接成功后向后端发送 type=bind,uid=当前连接用户uid 的绑定请求 */
  20. if ($rest->type == 'bind' && !isset($connection->uid)) {
  21. /**将请求用户id存在用户组中 */
  22. $connection->uid = $rest->uid;
  23. $this->uidArr[$connection->uid] = $connection;
  24. echo 'user:' . $rest->uid . 'bind';
  25. }
  26. /**群聊 */
  27. if ($rest->type == "text") {
  28. /**模型实例*/
  29. /**这里做数据库获取该群有哪些成员的操作,这里我用测试数据 */
  30. $group_user_ids_arr = [1,2,3];
  31. /**这里做将信息存入数据库并获取信息id的逻辑 */
  32. $saveMsg = $msgModel->insertGetId([
  33. 'from_user_id' => $rest->from_user_id, //来自
  34. 'to_gid' => $rest->to_gid, //给谁
  35. 'from_nickname' => $rest->from_nickname,//来自人昵称
  36. 'from_headimg' => $rest->from_headimg, //来自人头像
  37. 'datetime' => $rest->datetime, //消息时间
  38. 'msg' => $rest->msg, //消息内容
  39. 'type' => $rest->type //消息类型:文本...
  40. ]);
  41. /**将新消息id存入发送数据中方便做后续撤回等操作*/
  42. /**解析信息 */
  43. $newData = json_decode($data, true);
  44. /**赋值信息数据自增id */
  45. $newData['id'] = $saveMsg;
  46. /**针对群用户发消息 */
  47. foreach ($group_user_ids_arr as $key => $value) {
  48. /**针对在线用户并且!!排除自己
  49. (前端配合将消息push到当前发送消息的用户)!!发消息 */
  50. if (isset($this->uidArr[$value]) && $value != $rest->from_user_id) {
  51. $conn = $this->uidArr[$value];
  52. /**发送信息 */
  53. $conn->send(json_encode($newData));
  54. //前端回调后要判断当前接收消息的群id将消息放进对应的群,不然会出现用户在线不管在哪个群都会收到消息的问题!!!
  55. }
  56. }
  57. }
  58. }
  59. /**
  60. * 当连接建立时触发的回调函数
  61. * @param $connection
  62. */
  63. public function onConnect($connection)
  64. {
  65. print_r('连接成功');
  66. }
  67. /**
  68. * 当连接断开时触发的回调函数
  69. * @param $connection
  70. */
  71. public function onClose($connection)
  72. {
  73. print_r('用户断开了链接!');
  74. }
  75. /**
  76. * 当客户端的连接上发生错误时触发
  77. * @param $connection
  78. * @param $code
  79. * @param $msg
  80. */
  81. public function onError($connection, $code, $msg)
  82. {
  83. echo "error $code $msg\n";
  84. }
  85. /**
  86. * 每个进程启动
  87. * @param $worker
  88. */
  89. public function onWorkerStart($worker)
  90. {
  91. }
  92. }

总结

此方法需要前端配合判断当前接收信息的群id将消息放进对应的群,不然会出现用户在线不管在哪个群都会收到消息的问题!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/257709
推荐阅读
相关标签
  

闽ICP备14008679号