Bläddra i källkod

up: 刷数据日志,IP地址带上了中文的位置提示

王刚 1 år sedan
förälder
incheckning
62b722d43c

+ 0 - 3
DevOps/flscfg/bintool/ossutil/ossutil.bat

@@ -1,3 +0,0 @@
-@ECHO OFF 
-cmd /k cd /d .
-set PATH=.;%PATH%

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 311 - 0
DevOps/flscfg/sqlback/jzhj2023_cfg20230829151048.sql


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 311 - 0
DevOps/flscfg/sqlback/jzhj2023_cfg20230829152948.sql


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 311 - 0
DevOps/flscfg/sqlback/jzhj2023_cfg20230829160409.sql


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 311 - 0
DevOps/flscfg/sqlback/jzhj2023_cfg20230830090056.sql


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 311 - 0
DevOps/flscfg/sqlback/jzhj2023_cfg20230830141954.sql


+ 2 - 1
Gameserver/App/service_call/cmemdata/kvflush.php

@@ -69,7 +69,8 @@ class kvflush {
     }
 
     static function log($user, $modelname) {
-        $who = $user . '_' . HttpUtil::clientIP();
+        $ip = HttpUtil::clientIP();
+        $who = $user . '_' . $ip . ':' . HttpUtil::IpInfo($ip);
         $key = "log-flush";
         CLog::warn($who . "flushing  [$modelname]", __CLASS__);                 # 写文件
         $ret = gMem()->hset($key, $who, TimeUtil::tsYmdHis());                  # 写入mem

+ 15 - 1
Gameserver/App/test.php

@@ -13,7 +13,7 @@ echoLine("tsDay:" . totalDays());
 
 use \loyalsoft\pay\OrderNotice;
 
-SelfChecker::CheckAll();
+//SelfChecker::CheckAll();
 //
 //*
 //set_time_limit(15);                                                           #
@@ -25,3 +25,17 @@ SelfChecker::CheckAll();
 //\loyalsoft\TapDBUtil::TestPay();
 //\loyalsoft\CLog::err("wg");
 //$a = new \sm_activity_tiligift();
+// PHP 纯真 IP 地址数据库自动更新功能
+//$ip = new IPQuery();
+test(function () {
+    $addr = HttpUtil::IpInfo('123.233.233.233');
+    echoLine($addr);
+}, 10);
+
+//
+//echo "<pre>
+//IP起始段:{$addr['beginip']}
+//IP结束段:{$addr['endip']}
+//实际地址:{$addr['pos']}
+//运 营 商:{$addr['isp']}
+//</pre>";

+ 13 - 1
Gameserver/App/util/HttpUtil.php

@@ -2,6 +2,8 @@
 
 namespace loyalsoft;
 
+include_once 'IPQuery/IPQuery.php';
+
 /**
  * Http辅助类,可以发送请求/接收请求(提取参数)
  * @author gwang (email: mail@wanggangzero.cn)
@@ -219,6 +221,17 @@ class HttpUtil {
         }
     }
 
+    /**
+     * 获取ip的位置信息(中文)
+     * @param type $ip
+     * @return string
+     */
+    public static function IpInfo($ip) {
+        $query = new \IPQuery();
+        $info = $query->query($ip);
+        return "{$info["pos"]}-{$info["isp"]}";
+    }
+
     private static function is_ip($str) {
         $ip = explode('.', $str);
         for ($i = 0; $i < count($ip); $i++) {
@@ -228,7 +241,6 @@ class HttpUtil {
         }
         return preg_match('/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/', $str);
     }
-
 }
 
 /**

+ 201 - 0
Gameserver/App/util/IPQuery/IPQuery.php

@@ -0,0 +1,201 @@
+<?php
+
+/**
+ * 纯真 IP 数据库查询
+ *
+ * 参考资料:
+ * - 纯真 IP 数据库 http://www.cz88.net/ip/
+ * 使用示例:
+ *   $ip = new IPQuery();
+ *   $addr = $ip->query('IP地址');
+ *   print_r($addr);
+ */
+class IPQuery {
+
+    private $fh;        // IP数据库文件句柄
+    private $first;     // 第一条索引
+    private $last;      // 最后一条索引
+    private $total;     // 索引总数
+    private $dbFile = __DIR__ . DIRECTORY_SEPARATOR . 'qqwry.dat';      // 纯真 IP 数据库文件存放路径
+    private $dbExpires = 86400 * 10;        // 数据库文件有效期(10天)如无需自动更新 IP 数据库,请将此值改为 0
+
+    // 构造函数
+    function __construct() {
+        // IP 数据库文件不存在或已过期,则自动获取
+        if (!file_exists($this->dbFile) || ($this->dbExpires && ((time() - filemtime($this->dbFile)) > $this->dbExpires))) {
+            $this->update();
+        }
+    }
+
+    // 忽略超时
+    private function ignore_timeout() {
+        @ignore_user_abort(true);
+        @ini_set('max_execution_time', 48 * 60 * 60);
+        @set_time_limit(48 * 60 * 60);    // set_time_limit(0)  2day
+        @ini_set('memory_limit', '4000M'); // 4G;
+    }
+
+    // 读取little-endian编码的4个字节转化为长整型数
+    private function getLong4() {
+        $result = unpack('Vlong', fread($this->fh, 4));
+        return $result['long'];
+    }
+
+    // 读取little-endian编码的3个字节转化为长整型数
+    private function getLong3() {
+        $result = unpack('Vlong', fread($this->fh, 3) . chr(0));
+        return $result['long'];
+    }
+
+    // 查询位置信息
+    private function getPos($data = '') {
+        $char = fread($this->fh, 1);
+        while (ord($char) != 0) {   // 地区信息以 0 结束
+            $data .= $char;
+            $char = fread($this->fh, 1);
+        }
+        return $data;
+    }
+
+    // 查询运营商
+    private function getISP() {
+        $byte = fread($this->fh, 1);    // 标志字节
+        switch (ord($byte)) {
+            case 0: $area = '';
+                break;  // 没有相关信息
+            case 1: // 被重定向
+                fseek($this->fh, $this->getLong3());
+                $area = $this->getPos();
+                break;
+            case 2: // 被重定向
+                fseek($this->fh, $this->getLong3());
+                $area = $this->getPos();
+                break;
+            default: $area = $this->getPos($byte);
+                break;     // 没有被重定向
+        }
+        return $area;
+    }
+
+    // 检查 IP 格式是否正确
+    public function checkIp($ip) {
+        $arr = explode('.', $ip);
+        if (count($arr) != 4)
+            return false;
+        for ($i = 0; $i < 4; $i++) {
+            if ($arr[$i] < '0' || $arr[$i] > '255') {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    // 查询 IP 地址
+    public function query($ip) {
+        if (!$this->checkIp($ip)) {
+            return false;
+        }
+
+        $this->fh = fopen($this->dbFile, 'rb');
+        $this->first = $this->getLong4();
+        $this->last = $this->getLong4();
+        $this->total = ($this->last - $this->first) / 7;    // 每条索引7字节
+
+        $ip = pack('N', intval(ip2long($ip)));
+
+        // 二分查找 IP 位置
+        $l = 0;
+        $r = $this->total;
+        while ($l <= $r) {
+            $m = floor(($l + $r) / 2);     // 计算中间索引
+            fseek($this->fh, $this->first + $m * 7);
+            $beginip = strrev(fread($this->fh, 4)); // 中间索引的开始IP地址
+            fseek($this->fh, $this->getLong3());
+            $endip = strrev(fread($this->fh, 4));   // 中间索引的结束IP地址
+
+            if ($ip < $beginip) {   // 用户的IP小于中间索引的开始IP地址时
+                $r = $m - 1;
+            } else {
+                if ($ip > $endip) { // 用户的IP大于中间索引的结束IP地址时
+                    $l = $m + 1;
+                } else {            // 用户IP在中间索引的IP范围内时
+                    $findip = $this->first + $m * 7;
+                    break;
+                }
+            }
+        }
+
+        // 查找 IP 地址段
+        fseek($this->fh, $findip);
+        $location['beginip'] = long2ip($this->getLong4());   // 用户IP所在范围的开始地址
+        $offset = $this->getlong3();
+        fseek($this->fh, $offset);
+        $location['endip'] = long2ip($this->getLong4());     // 用户IP所在范围的结束地址
+        // 查找 IP 信息
+        $byte = fread($this->fh, 1); // 标志字节
+        switch (ord($byte)) {
+            case 1:  // 都被重定向
+                $countryOffset = $this->getLong3(); // 重定向地址
+                fseek($this->fh, $countryOffset);
+                $byte = fread($this->fh, 1); // 标志字节
+                switch (ord($byte)) {
+                    case 2: // 信息被二次重定向
+                        fseek($this->fh, $this->getLong3());
+                        $location['pos'] = $this->getPos();
+                        fseek($this->fh, $countryOffset + 4);
+                        $location['isp'] = $this->getISP();
+                        break;
+                    default: // 信息没有被二次重定向
+                        $location['pos'] = $this->getPos($byte);
+                        $location['isp'] = $this->getISP();
+                        break;
+                }
+                break;
+
+            case 2: // 信息被重定向
+                fseek($this->fh, $this->getLong3());
+                $location['pos'] = $this->getPos();
+                fseek($this->fh, $offset + 8);
+                $location['isp'] = $this->getISP();
+                break;
+
+            default: // 信息没有被重定向
+                $location['pos'] = $this->getPos($byte);
+                $location['isp'] = $this->getISP();
+                break;
+        }
+
+        // 信息转码处理
+        foreach ($location as $k => $v) {
+            $location[$k] = iconv('gb2312', 'utf-8', $v);
+            $location[$k] = preg_replace(array('/^.*CZ88\.NET.*$/isU', '/^.*纯真.*$/isU', '/^.*日IP数据/'), '', $location[$k]);
+            $location[$k] = htmlspecialchars($location[$k]);
+        }
+
+        return $location;
+    }
+
+    // 更新数据库 https://www.22vd.com/40035.html
+    public function update() {
+        $this->ignore_timeout();
+        $copywrite = file_get_contents('http://update.cz88.net/ip/copywrite.rar');
+        $qqwry = file_get_contents('http://update.cz88.net/ip/qqwry.rar');
+        $key = unpack('V6', $copywrite)[6];
+        for ($i = 0; $i < 0x200; $i++) {
+            $key *= 0x805;
+            $key++;
+            $key = $key & 0xFF;
+            $qqwry[$i] = chr(ord($qqwry[$i]) ^ $key);
+        }
+        $qqwry = gzuncompress($qqwry);
+        file_put_contents($this->dbFile, $qqwry);
+    }
+
+    // 析构函数
+    function __destruct() {
+        if ($this->fh) {
+            fclose($this->fh);
+        }
+        $this->fp = null;
+    }
+}

BIN
DevOps/flscfg/bintool/ossutil/ossutil.exe → Gameserver/App/util/IPQuery/qqwry.dat


Vissa filer visades inte eftersom för många filer har ändrats