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

179 lines
4.8 KiB
PHP

<?php
use app\controllers\ServerTickController;
use comm\ClientMessageUtil;
use comm\SocketCommUtil;
use common\utils\RedisKeyUtil;
use common\utils\SocketEnum;
use yii\console\Application;
require(__DIR__ . '/../common/vendor/autoload.php');
require(__DIR__ . '/../common/vendor/yiisoft/yii2/Yii.php');
require(__DIR__ . '/../common/vendor/swiftmailer/swiftmailer/lib/swift_required.php');
require(__DIR__ . '/autoloader.php');
/**
* Created by PhpStorm.
* User: zn
* Date: 2017/6/14
* Time: 10:05
*/
class SwooleYiiApp
{
/**
* @var Application
*/
public static $app;
/**
* @var swoole_websocket_server;
*/
public static $server;
//进行web检查的workerID
public static $serverTickWorkerID = -1;
public static $redis;
function __construct()
{
defined('YII_DEBUG') or define('YII_DEBUG', false);
defined('YII_ENV') or define('YII_ENV', 'prod');
$config = require(__DIR__ . '/config/main.php');
self::$app = new Application($config);
self::$server = new swoole_websocket_server("0.0.0.0", Yii::$app->params['socket_port']);
self::$server->on('open', [$this, 'open']);
//监听WebSocket消息事件
self::$server->on('message', [$this, 'message']);
//监听WebSocket连接关闭事件
self::$server->on('close', [$this, 'close']);
//sorker
self::$server->on('WorkerStart', [$this, 'onWorkerStart']);
self::$server->on('WorkerStop', [$this, 'onWorkerStop']);
//task
self::$server->on('Task', [$this, 'onTask']);
self::$server->on('Finish', [$this, 'onTaskFinish']);
self::$server->set([
'log_file' => 'runtime/logs/swoole.log',
'task_worker_num' => 10,
'log_level' => 0,
'daemonize' => 0,
]);
//添加tick轮训令牌
self::$redis = new Redis();
self::$redis->connect(self::$app->params['redis_server'],self::$app->params['redis_port']);
self::$redis->lpush(RedisKeyUtil::serverTick(), 1);
self::$server->start();
}
/**
* 客户链接
* @param swoole_websocket_server $server
* @param swoole_http_request $request
*/
public function open(swoole_websocket_server $server, swoole_http_request $request)
{
SocketCommUtil::log('连接', $request->fd, null);
}
/**
* 消息
* @param swoole_websocket_server $server
* @param swoole_websocket_frame $frame
*/
public function message(swoole_websocket_server $server, swoole_websocket_frame $frame)
{
SocketCommUtil::log('接收消息', $frame->fd, $frame->data);
$data = json_decode($frame->data, true);
if (empty($data)) return;
$data['fd'] = $frame->fd;
try {
self::$app->runAction('client-message/message', [$data]);
} catch (Exception $e) {
ClientMessageUtil::SendClientMessage($frame->fd, SocketEnum::COMMAND_ERROR_R, 0, $e->getMessage());
}
}
/**
* 关闭链接
* @param swoole_websocket_server $server
* @param $fd
*/
public function close(swoole_websocket_server $server, $fd)
{
SocketCommUtil::log('连接关闭', $fd);
ClientMessageUtil::clearCloseClient($fd);
}
/**
* Worker
* @param swoole_server $server
* @param $worker_id
*/
public function onWorkerStart(swoole_server $server, $worker_id)
{
//取轮训令牌
$key = self::$redis->rpop(RedisKeyUtil::serverTick());
if (!empty($key)) {
SwooleYiiApp::$serverTickWorkerID = $worker_id;
//开启web服务器消息检查
$server->tick(self::$app->params['socket_web_server_message_tick_time'], function () {
ServerTickController::sendServerMessage();
});
//开启web服务器消息检查
$server->tick(self::$app->params['socket_broadcast_message_tick_time'], function () {
ServerTickController::tickBroadcastMessage();
});
}
}
public function onWorkerStop(swoole_server $server, $worker_id)
{
if (SwooleYiiApp::$serverTickWorkerID == $worker_id) {
SwooleYiiApp::$serverTickWorkerID = -1;
//归还轮训令牌
self::$app->redis->lpush(RedisKeyUtil::serverTick(), 1);
}
}
/**Task
* @param swoole_server $serv
* @param $task_id
* @param $src_worker_id
* @param $data
*/
function onTask(swoole_server $serv, $task_id, $src_worker_id, $data)
{
if ($data == SocketEnum::TASK_ALL_BROADCAST_MESSAGE) {
ServerTickController::broadcastMessage();
}
}
function onTaskFinish(swoole_server $serv, $task_id, $data)
{
}
}
new SwooleYiiApp();