get['token'] ?? ''; $userInfo = $this->jwt->getParserData($token); stdout_log()->notice("用户连接信息 : user_id:{$userInfo['user_id']} | fd:{$request->fd} | data:" . Json::encode($userInfo)); stdout_log()->notice('连接时间:' . date('Y-m-d H:i:s')); // 绑定fd与用户关系 $this->socketFDService->bindRelation($request->fd, $userInfo['user_id']); $ip = config('ip_address'); $server->push($request->fd, "成功连接[{$ip}],IM 服务器"); } /** * 消息接收回调事件 * * @param Response|Server $server * @param Frame $frame */ public function onMessage($server, Frame $frame): void { // 判断是否为心跳检测 if ($frame->data == 'PING') return; $ip = config('ip_address'); $producer = container()->get(Producer::class); $producer->produce(new ChatMessageProducer("我是来自[{$ip} 服务器的消息],{$frame->data}")); } /** * 连接创建成功回调事件 * * @param Response|\Swoole\Server $server * @param int $fd * @param int $reactorId */ public function onClose($server, int $fd, int $reactorId): void { $user_id = $this->socketFDService->findFdUserId($fd); stdout_log()->notice("客户端FD:{$fd} 已关闭连接,用户ID为【{$user_id}】"); stdout_log()->notice('关闭时间:' . date('Y-m-d H:i:s')); // 解除fd关系 $this->socketFDService->removeRelation($fd); // 判断是否存在异地登录 $isOnline = $this->socketFDService->isOnlineAll(intval($user_id)); if (!$isOnline) { // ... 不存在异地登录,推送下线通知消息 // ... 包装推送消息至队列 } else { stdout_log()->notice("用户:{$user_id} 存在异地登录..."); } } }