Parcourir la source

烧掉压死数据库的最后一根稻草

孔雀 il y a 4 ans
Parent
commit
4b8200f957

+ 2 - 1
resources/views/material/crisp.tpl

@@ -7,9 +7,10 @@
         s.async = 1;
         d.getElementsByTagName("head")[0].appendChild(s);
     })();
+    $crisp.push(["safe", true])
     $crisp.push(["set","user:nickname", "{$user->user_name}"],
               ["set","user:email","{$user->email}"],
-              ["set", "session:data", 
+              ["set", "session:data",
                 [[
                   ["ID","{$user->id}"],
                   ["Email","{$user->email}"],

+ 7 - 4
src/Controllers/Mod_Mu/UserController.php

@@ -88,13 +88,16 @@ class UserController extends BaseController
         } elseif ($node->sort == 11) {
             $key_list = array('node_speedlimit', 'u', 'd', 'transfer_enable', 'id', 'node_connector', 'uuid', 'alive_ip');
         } else {
-            $key_list = array('method', 'obfs', 'obfs_param', 'protocol', 'protocol_param', 'node_speedlimit',
-                'is_multi_user', 'u', 'd', 'transfer_enable', 'id', 'port', 'passwd', 'node_connector', 'alive_ip');
+            $key_list = array(
+                'method', 'obfs', 'obfs_param', 'protocol', 'protocol_param', 'node_speedlimit',
+                'is_multi_user', 'u', 'd', 'transfer_enable', 'id', 'port', 'passwd', 'node_connector', 'alive_ip'
+            );
         }
 
+        $alive_ip = (new \App\Models\Ip)->getUserAliveIpCount();
         foreach ($users_raw as $user_raw) {
             if ($user_raw->node_connector != 0) {
-                $user_raw->alive_ip = (new \App\Models\Ip)->getUserAliveIpCount($user_raw->id);
+                $user_raw->alive_ip = $alive_ip[strval($user_raw->id)];
             }
             if ($user_raw->transfer_enable <= $user_raw->u + $user_raw->d) {
                 if ($_ENV['keep_connect'] === true) {
@@ -120,7 +123,7 @@ class UserController extends BaseController
 
         $header_etag = $request->getHeaderLine('IF_NONE_MATCH');
         $etag = Tools::etag($users);
-        if ($header_etag == $etag){
+        if ($header_etag == $etag) {
             return $response->withStatus(304);
         }
         return $response->withHeader('ETAG', $etag)->withJson([

+ 8 - 2
src/Models/Ip.php

@@ -4,6 +4,7 @@ namespace App\Models;
 
 use App\Utils\QQWry;
 use App\Utils\Tools;
+use App\Utils\DatatablesHelper;
 
 /**
  * Ip Model
@@ -81,9 +82,14 @@ class Ip extends Model
         return Node::where('node_ip', Tools::getRealIp($this->ip))->first() ? '是' : '否';
     }
 
-    public function getUserAliveIpCount($userid)
+    public function getUserAliveIpCount()
     {
-        return count(self::where('userid', '=', $userid)->where('datetime', '>=', time() - 60)->get());
+        $db = new DatatablesHelper();
+        $res = [];
+        foreach ($db->query('SELECT `userid`, COUNT(`userid`) AS `count` FROM `alive_ip` WHERE `datetime` >= unix_timestamp(now()) - 60 GROUP BY `userid`') as $line) {
+            $res[strval($line->userid)] = $res[$line->count];
+        }
+        return $res;
     }
 
     public function ip()