179 lines
4.8 KiB
PHP
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(); |