hy-farm/muchang/homesocket/controllers/ServerTickController.php
2026-05-29 19:54:56 +08:00

115 lines
3.1 KiB
PHP

<?php
/**
* Created by PhpStorm.
* User: zn
* Date: 2017/6/15
* Time: 15:40
*/
namespace app\controllers;
use comm\ClientMessageUtil;
use comm\SocketCommUtil;
use common\models\UserInfo;
use common\utils\RedisKeyUtil;
use common\utils\SocketEnum;
use SwooleYiiApp;
/**
* 服务器消息
* Class ServerMessageController
* @package app\controllers
*/
class ServerTickController
{
/**
* web服务器消息检查
*/
public static function sendServerMessage()
{
$key = RedisKeyUtil::clientMessageList();
do {
$jsonStr = SwooleYiiApp::$redis->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;
}
}