|
|
@@ -14,7 +14,6 @@ use app\lib\GlobConfigs;
|
|
|
use Illuminate\Database\Capsule\Manager as Capsule;
|
|
|
use Illuminate\Database\Capsule\Manager as DB;
|
|
|
use app\lib\Wlog;
|
|
|
-use app\logic\MyPgsql as MyPgsql;
|
|
|
|
|
|
class MyServerV2
|
|
|
{
|
|
|
@@ -22,7 +21,6 @@ class MyServerV2
|
|
|
|
|
|
//线程连接实例
|
|
|
private $workRedis = null;
|
|
|
- private $workMysql = null;
|
|
|
private $workPgsql = null;
|
|
|
|
|
|
public function __construct()
|
|
|
@@ -69,12 +67,6 @@ class MyServerV2
|
|
|
$this->PingRedis($serv, $worker_id);
|
|
|
});
|
|
|
|
|
|
- /*
|
|
|
- $this->PingMysql($serv, $worker_id);
|
|
|
- $serv->tick(5000, function () use ($serv, $worker_id) {
|
|
|
- $this->PingMysql($serv, $worker_id);
|
|
|
- });
|
|
|
- */
|
|
|
$this->PingPgsql($serv, $worker_id);
|
|
|
$serv->tick(5000, function () use ($serv, $worker_id) {
|
|
|
$this->PingPgsql($serv, $worker_id);
|
|
|
@@ -87,50 +79,6 @@ class MyServerV2
|
|
|
TimeRsync::getInstance()->DoTimePublic($serv, $worker_id, $this->workRedis);
|
|
|
});
|
|
|
|
|
|
- MyPgsql::getInstance();
|
|
|
-
|
|
|
- //消息订阅
|
|
|
- if ($worker_id == 0) {
|
|
|
-
|
|
|
- if (!$worker_id) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- go(function () use ($serv, $worker_id) {
|
|
|
- $config = GlobConfigs::getKey('redis');
|
|
|
- $redis = new \Swoole\Coroutine\Redis();
|
|
|
- $redis->setOptions(['compatibility_mode' => true]);
|
|
|
- $redis->connect($config['host'], $config['port']);
|
|
|
- $r = $redis->SUBSCRIBE([MSG_REDIS_SUBSCRIBE, 'TEST']);
|
|
|
- if ($r) {
|
|
|
- while ($msg = $redis->recv()) {
|
|
|
- print_r($msg);
|
|
|
- // msg是一个数组, 包含以下信息
|
|
|
- // $type # 返回值的类型:显示订阅成功
|
|
|
- // $name # 订阅的频道名字 或 来源频道名字
|
|
|
- // $info # 目前已订阅的频道数量 或 信息内容
|
|
|
- list($type, $name, $info) = $msg;
|
|
|
- if ($type == 'subscribe') // 或psubscribe
|
|
|
- {
|
|
|
- // 频道订阅成功消息,订阅几个频道就有几条
|
|
|
- } else if ($type == 'unsubscribe' && $info == 0) // 或punsubscribe
|
|
|
- {
|
|
|
- break; // 收到取消订阅消息,并且剩余订阅的频道数为0,不再接收,结束循环
|
|
|
- } else if ($type == 'message') // 若为psubscribe,此处为pmessage
|
|
|
- {
|
|
|
- /*
|
|
|
- if ($need_unsubscribe) // 某个情况下需要退订
|
|
|
- {
|
|
|
- $redis->unsubscribe(); // 继续recv等待退订完成
|
|
|
- }
|
|
|
- */
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -140,16 +88,13 @@ class MyServerV2
|
|
|
if ($this->workRedis) {
|
|
|
$this->workRedis->close();
|
|
|
}
|
|
|
- if ($this->workMysql) {
|
|
|
- $this->workMysql->close();
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
|
|
|
public function onMessage($serv, $frame)
|
|
|
{
|
|
|
- if (strtolower($frame->data->data) == '{"type":"ping"}') {
|
|
|
- $serv->send($frame->fd, '{"type":"pong"}');
|
|
|
+ if (strtolower($frame->data) == strtolower('{"type":"ping"}')) {
|
|
|
+ $serv->push($frame->fd, '{"type":"pong"}');
|
|
|
return;
|
|
|
}
|
|
|
Wlog::getInstance()->WriteLog($frame);
|
|
|
@@ -158,16 +103,26 @@ class MyServerV2
|
|
|
|
|
|
public function onOpen($serv, $request)
|
|
|
{
|
|
|
- //Wlog::getInstance()->WriteLog(['onOpenData', $request]);
|
|
|
+ $config = GlobConfigs::getKey('swoole');
|
|
|
+ if (count($serv->connections) > $config['maxUsers']) {
|
|
|
+ $serv->push($request->fd, DataPack::toJson(['mtype' => 'system_msg', 'stype' => 'maxUsers', 'data' => '超过人数上限']));
|
|
|
+ $serv->disconnect($request->fd);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
$token = isset($request->get['token']) ? $request->get['token'] : '';
|
|
|
//$uid = isset($request->get['uid']) ? $request->get['uid'] : '';
|
|
|
$fd = $request->fd;
|
|
|
$redis = $this->workRedis;
|
|
|
if (!$redis) {
|
|
|
+ $serv->push($request->fd, DataPack::toJson(['mtype' => 'system_msg', 'stype' => 'error', 'data' => ['msg' => '服务端错误!-01']]));
|
|
|
+ $serv->disconnect($request->fd);
|
|
|
return;
|
|
|
}
|
|
|
+
|
|
|
$token_uid = $uid = intval($this->workRedis->hget(MAPS_TOKEN_UID, md5($token)));
|
|
|
- if (empty($token) || !$token_uid) {
|
|
|
+ echo '新请求uid-'.$token_uid.' fd-'.$fd.' 接入....'."\n";
|
|
|
+ if (empty($token) || empty($token_uid) || $token_uid == '' || $token_uid == 0) {
|
|
|
$serv->push($request->fd, DataPack::toJson(['mtype' => 'system_msg', 'stype' => 'invalid_token', 'data' => ['msg' => '无效的token']]));
|
|
|
$serv->disconnect($request->fd);
|
|
|
return;
|
|
|
@@ -186,10 +141,18 @@ class MyServerV2
|
|
|
$this->workRedis->hset(MAPS_FID_UID, $fd, $uid);
|
|
|
$serv->ftable->set($fd, ['uid' => $uid]);
|
|
|
$serv->utable->set($uid, ['fid' => $fd]);
|
|
|
+ } else {
|
|
|
+ if (!$this->admin_ip_Check($request->server['remote_addr'], $adminconfig['whiteips'])) {
|
|
|
+ $serv->push($request->fd, DataPack::toJson(['mtype' => 'system_msg', 'stype' => 'force_logout', 'data' => ['msg' => '登陆被限!' . $request->server['remote_addr']]]));
|
|
|
+ $serv->disconnect($request->fd);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ $this->workRedis->hset(MAPS_FID_UID, $fd, $uid);
|
|
|
+ $serv->ftable->set($fd, ['uid' => $uid]);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- $serv->push($fd, DataPack::toJson(['mtype' => 'system_msg', 'stype' => 'well_come', 'data' => ['msg' => '成功接入']]));
|
|
|
+ $msg = '成功接入 [' . $request->server['remote_addr'] . ' - ' . $fd . ' - ' . $uid . "]";
|
|
|
+ $serv->push($fd, DataPack::toJson(['mtype' => 'system_msg', 'stype' => 'well_come', 'data' => ['msg' => $msg]]));
|
|
|
}
|
|
|
|
|
|
public function onTask($serv, \Swoole\Server\Task $task)
|
|
|
@@ -217,6 +180,9 @@ class MyServerV2
|
|
|
|
|
|
$serv->ftable->del($fd);
|
|
|
$serv->utable->del($uid);
|
|
|
+ } else {
|
|
|
+ $this->workRedis->hdel(MAPS_FID_UID, $fd);
|
|
|
+ $serv->ftable->del($fd);
|
|
|
}
|
|
|
echo "ClientFd:{$fd} -- uid:{$uid} close connection!\n";
|
|
|
}
|
|
|
@@ -265,43 +231,6 @@ class MyServerV2
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- //Mysql Ping检测
|
|
|
- private function PingMysql($serv, $worker_id)
|
|
|
- {
|
|
|
- if (empty($this->workMysql)) {
|
|
|
- $this->ConectToMysql($serv, $worker_id);
|
|
|
- return true;
|
|
|
- }
|
|
|
- $mysql = $this->workMysql;
|
|
|
- if (!$mysql) {
|
|
|
- $ping_ret = false;
|
|
|
- } else {
|
|
|
- $ping_ret_s = DB::select("select version() as v");
|
|
|
- $ping_ret = !empty($ping_ret_s) ? true : false;
|
|
|
- }
|
|
|
-
|
|
|
- if (!$ping_ret) {
|
|
|
- return $this->ConectToMysql($serv, $worker_id);
|
|
|
- }
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- //工作线程 同步阻塞 Mysql 客户端
|
|
|
- private function ConectToMysql($serv, $worker_id)
|
|
|
- {
|
|
|
- $conf = GlobConfigs::getKey('mysql');
|
|
|
- $mysql = new Capsule();
|
|
|
- $mysql->addConnection($conf);
|
|
|
- $mysql->setAsGlobal();
|
|
|
- $mysql->bootEloquent();
|
|
|
-
|
|
|
- Wlog::getInstance()->WriteLog("success:成功建立Mysql连接 " . date("Y-m-d H:i:s") . ' ' . $worker_id);
|
|
|
- $this->workMysql = $mysql;
|
|
|
- return $mysql;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
//Mysql Ping检测
|
|
|
private function PingPgsql($serv, $worker_id)
|
|
|
{
|
|
|
@@ -359,10 +288,29 @@ class MyServerV2
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- //redis推送消息
|
|
|
- private function MsgRedisList($serv, $worker_id)
|
|
|
+ //admin ip check
|
|
|
+ private function admin_ip_Check($ip, $okipArray = [])
|
|
|
{
|
|
|
-
|
|
|
+ if (empty($okipArray)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ foreach ($okipArray as $aip) {
|
|
|
+ if ($ip === $aip) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ $spos = strpos($aip, "*");
|
|
|
+ if ($spos === false) {
|
|
|
+ continue;
|
|
|
+ } else {
|
|
|
+ for ($i = 0; $i < $spos; $i++) {
|
|
|
+ if ($ip[$i] != $aip[$i]) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
}
|
|
|
|
|
|
|