rpop($key); if (empty($jsonStr)) return; $data = json_decode($jsonStr, true); if (empty($data)) continue; $userID = isset($data['be_user_id']) ? $data['be_user_id'] : null; if (empty($userID)) continue; $userInfo = UserInfo::loadByUserID($userID); if (empty($userInfo)) continue; //发送消息 ClientMessageUtil::SendClientMessage($userInfo->fd, SocketEnum::COMMAND_MESSAGE_R, 0, $jsonStr); } while (true); } /** * 全服广播检测 */ public static function tickBroadcastMessage() { $count = SwooleYiiApp::$redis->llen(RedisKeyUtil::broadcaseMessageList()); if ($count == 0) return; if (count(SwooleYiiApp::$server->connections) == 0) SwooleYiiApp::$redis->del(RedisKeyUtil::broadcaseMessageList()); $status = SwooleYiiApp::$server->stats(); if ($status['tasking_num'] > 10) return; // SocketCommUtil::log('test','startTask'); // SwooleYiiApp::$server->task(SocketEnum::TASK_ALL_BROADCAST_MESSAGE); self::broadcastMessage(); } public static function broadcastMessage() { SocketCommUtil::log('test','doTask'); //获取消息列表 $messageList = []; do { $message = SwooleYiiApp::$redis->rpop(RedisKeyUtil::broadcaseMessageList()); if ($message == null) break; $messageData = json_decode($message, true); array_push($messageList, $messageData); } while (true); //获取客户端列表 $fdList = SwooleYiiApp::$server->connections; $startTime = time(); $messageCount = count($messageList); $fdListCount = count($fdList); SocketCommUtil::log('全服广播', null, sprintf('消息数:%d,用户数:%d', $messageCount, $fdListCount)); $doCount = 0; foreach (SwooleYiiApp::$server->connections as $fd) { //发送消息 foreach ($messageList as $message) { ClientMessageUtil::SendClientMessage($fd, $message['command_id'], 0, $message['data']); } $doCount++; if ($doCount >= 500) { //间隔1秒执行1次 sleep(1); $doCount = 0; } } $endTime = time(); SocketCommUtil::log('全服广播结束', null, sprintf('消息数:%d,用户数:%d,耗时:%d秒', $messageCount, $fdListCount, $endTime - $startTime)); return true; } }