查看: 826|回复: 0

基于thinkphp的fastadmin使用composer安装swoole并启用swoole的websocket服务

[复制链接]

748

主题

39

回帖

3907

积分

管理员

总舵主

积分
3907
QQ
发表于 2024-10-18 17:55:12 | 显示全部楼层 |阅读模式
基于thinkphp的fastadmin使用composer安装swoole并启用swoole的websocket服务,首先在站点根目录建立服务启动swoole/start.php

  1. <?php
  2. require_once '/data/dj.zljt.net/application/common/library/WSServer.php';
  3. // 导入 WSServer 类所在的命名空间
  4. use app\common\library\WSServer;

  5. // 实例化 WSServer 类并启动服务器
  6. $ws = new WSServer();
  7. // \think\Log::record($ws);
  8. $ws->start();
复制代码
在application/common/libary/WSServer.php中写如下代码:
  1. <?php
  2. namespace app\common\library;
  3. require_once '/data/dj.zljt.net/vendor/topthink/think-swoole/src/Server.php';
  4. use fast\Random;
  5. use think\Hook;
  6. use think\swoole\Server;

  7. /**
  8. * 短信验证码类
  9. */
  10. class WSServer extends Server
  11. {
  12.     protected $host = '127.0.0.1'; //监听所有地址
  13.     protected $port = 9501; //监听9501端口
  14.     protected $serverType = 'socket';
  15.     protected $option = [
  16.         'worker_num'=>  4, //设置启动的Worker进程数
  17.         'daemonize'        =>  false, //守护进程化(上线改为true)
  18.         'backlog'        =>  128, //Listen队列长度
  19.         'dispatch_mode' =>  2, //固定模式,保证同一个连接发来的数据只会被同一个worker处理

  20.         //心跳检测:每60秒遍历所有连接,强制关闭10分钟内没有向服务器发送任何数据的连接
  21.         'heartbeat_check_interval' =>  60,
  22.         'heartbeat_idle_time' =>  600
  23.     ];

  24.     //建立连接时回调函数
  25.     public function onOpen($server, $req)
  26.     {
  27.         $fd = $req->fd;//客户端标识
  28.         $uid = $req->get['uid'];//客户端传递的用户id
  29.         $token = $req->get['token'];//客户端传递的用户登录token

  30.         //省略token验证逻辑......
  31.         if (!$token) {
  32.             $arr = array('status'=> 2,'message'=> 'token已过期');
  33.             $server->push($fd, json_encode($arr));
  34.             $server->close($fd);
  35.             return;
  36.         }
  37.         //省略给用户绑定fd逻辑......
  38.         echo "用户{$uid}建立了连接,标识为{$fd}\n";
  39.     }

  40.     //接收数据时回调函数
  41.     public function onMessage($server, $frame)
  42.     {
  43.         $fd = $frame->fd;
  44.         $message = $frame->data;

  45.         //省略通过fd查询用户uid逻辑......
  46.         $uid = 666;
  47.         $data['uid'] = $uid;
  48.         $data['message'] = '用户'.$uid.'发送了:'.$message;
  49.         $data['post_time'] = date("m/d H:i",time());
  50.         $arr = array('status'=> 1,'message'=> 'success','data'=> $data);

  51.         //仅推送给当前连接用户
  52.         //$server- push($fd, json_encode($arr));

  53.         //推送给全部连接用户
  54.         foreach($server->connections as $fd) {
  55.             $server->push($fd, json_encode($arr));
  56.         }
  57.     }

  58.     //连接关闭时回调函数
  59.     public function onClose($server, $fd)
  60.     {
  61.         echo "标识{$fd}关闭了连接\n";
  62.     }
  63. }
复制代码
使用命令行进入根目录,运行:
  1. php server/start.php
复制代码
启用swoole
如果需要关闭:
php server/stop.php
如果关闭不了,可以先查看进程:
  1. ps aux | grep swoole
复制代码
第二列是pid,使用如下命令关闭:
  1. kill 10299
复制代码
10299是pid。
道不同,不相为谋!理想要有,万一实现了呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:2513533699@qq.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.|鲁ICP备19000917号|鲁公网安备37078302000320号

在本版发帖
关注公众号
QQ客服返回顶部