115 lines
3.1 KiB
PHP
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;
|
|
}
|
|
} |