|
@@ -5,15 +5,18 @@ namespace loyalsoft;
|
|
|
include_once __DIR__ . '/../../main.php';
|
|
|
require_once ROOTDIR . '/util/OpenSSLVerify.php'; # Ps. 这个文件和类名没有对应关系.
|
|
|
|
|
|
-define("CLOGUTIL_DEBUG", true);
|
|
|
|
|
|
/**
|
|
|
* Description of config
|
|
|
* 数据中转功能.
|
|
|
* 通过远程地址向服务器刷入Cmem的key-value数据. key和value通过gzcompress和base64处理.
|
|
|
* @version
|
|
|
- * 1.0.1 通过openssl,RSA验证发送方具有刷数据的权限.
|
|
|
- * 1.0.0 基础功能, 没有安全功能.
|
|
|
+ * 2.0.0 增加了将数据写入到PHP文件的功能(CodeGen_Folder),配合客户端生成的读取代码,可以避免从
|
|
|
+ * redis中获取数据, 而是直接从代码中获取数据, 在有代码缓存的情况下,
|
|
|
+ * 相当于直接使用内存中的数据, 节省了与redis的网络通讯时间(平均单次数据获取>1ms),
|
|
|
+ * 如果一段代码中使用到的配置数据比较多, 那么节省的时间消耗相当明显. -gwang 2020.11.27
|
|
|
+ * 1.0.1 通过openssl,RSA验证发送方具有刷数据的权限. -gwang 2017
|
|
|
+ * 1.0.0 基础功能, 没有安全功能. -gwang 2017
|
|
|
* @author gwang email:wanggangzero@qq.com
|
|
|
* @copyright © 2015-12-1, SJZ LoyalSoft Corporation & gwang. All rights reserved.
|
|
|
*/
|
|
@@ -25,6 +28,14 @@ define("CLOGUTIL_DEBUG", true);
|
|
|
*/
|
|
|
class kvflush {
|
|
|
|
|
|
+ /**
|
|
|
+ * RSA 密钥路径
|
|
|
+ */
|
|
|
+ const keyPath = ROOTDIR . "/util/key";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 刷入数据
|
|
|
+ */
|
|
|
public static function flush() {
|
|
|
InitZoneId(); # 初始化分区信息 Ps. $_REQUEST["zoneid"]
|
|
|
$params = HttpUtil::getQueryParas();
|
|
@@ -32,47 +43,36 @@ class kvflush {
|
|
|
$val = CommUtil::zb64decode(urldecode($params["val"]));
|
|
|
$user = urldecode($params["user"]);
|
|
|
$type = urldecode($params['type']);
|
|
|
- $keypath = ROOTDIR . "/util/key";
|
|
|
- $myrsa = new MyRsa($keypath);
|
|
|
$sign = urldecode($params['sign']);
|
|
|
-
|
|
|
+ $myrsa = new MyRsa(self::keyPath);
|
|
|
if (!$myrsa->verify_arr($params, $sign)) { # 验证下签名
|
|
|
- echo "签名验证失败!";
|
|
|
- } else {
|
|
|
-// CLog::info($key . " " . $val, "刷数据");
|
|
|
- switch ($type) {
|
|
|
- case 'hash':
|
|
|
- $val = json_decode($val); # 需要还原为Obj才能解开
|
|
|
- $ret = self::FlushToMem_hmSet($key, $val);
|
|
|
- self::FlushToFile_hash($key, $val);
|
|
|
- break;
|
|
|
- case 'normal':
|
|
|
- $ret = self::FlushToMem_set($key, $val);
|
|
|
- self::FlushToFile_str($key, $val);
|
|
|
- break;
|
|
|
- default :
|
|
|
- $ret = self::FlushToMem_set($key, $val);
|
|
|
- break;
|
|
|
- }
|
|
|
- if ($ret) {
|
|
|
- echo "success";
|
|
|
- self::log($user, $key); # 记录日志
|
|
|
- } else {
|
|
|
- echo "[$key] flush to mem failed!";
|
|
|
- }
|
|
|
+ exit("签名验证失败!");
|
|
|
}
|
|
|
unset($myrsa);
|
|
|
+ switch ($type) {
|
|
|
+ case 'hash':
|
|
|
+ $val = json_decode($val); # 需要还原为Obj才能解开
|
|
|
+ $ret = self::FlushToMem_hmSet($key, $val);
|
|
|
+ self::FlushToFile_hash($key, $val);
|
|
|
+ break;
|
|
|
+ case 'normal':
|
|
|
+ $ret = self::FlushToMem_set($key, $val);
|
|
|
+ self::FlushToFile_str($key, $val);
|
|
|
+ break;
|
|
|
+ default :
|
|
|
+ $ret = self::FlushToMem_set($key, $val);
|
|
|
+ self::FlushToFile_str($key, $val);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ echo($ret ? "success" : "[$key] flush to mem failed!");
|
|
|
+ self::log($user, $key); # 记录日志
|
|
|
}
|
|
|
|
|
|
-//put your code here
|
|
|
-
|
|
|
static function log($user, $modelname) {
|
|
|
$who = $user . '_' . HttpUtil::clientIP();
|
|
|
$key = "log-flush";
|
|
|
- CLog::warn($who . "flushing [$modelname]", __CLASS__); # 写文件
|
|
|
- $mem = gMem();
|
|
|
- $ret = $mem->hset($key, $who, TimeUtil::tsYmdHis()); # 写入mem
|
|
|
-// $mem->close();
|
|
|
+ CLog::warn($who . "flushing [$modelname]", __CLASS__); # 写文件
|
|
|
+ $ret = gMem()->hset($key, $who, TimeUtil::tsYmdHis()); # 写入mem
|
|
|
return $ret;
|
|
|
}
|
|
|
|
|
@@ -85,8 +85,7 @@ class kvflush {
|
|
|
public static function FlushToMem_set($key, $value) {
|
|
|
$mem = gMem();
|
|
|
$mem->delete($key);
|
|
|
- $ret = $mem->set($key, $value); # 写入mem
|
|
|
-// $mem->close();
|
|
|
+ $ret = $mem->set($key, $value); # 写入mem
|
|
|
return $ret;
|
|
|
}
|
|
|
|
|
@@ -97,7 +96,6 @@ class kvflush {
|
|
|
* @return type
|
|
|
*/
|
|
|
public static function FlushToMem_hmSet($key, $assoc_array) {
|
|
|
- $mem = gMem();
|
|
|
if (!is_array($assoc_array)) {
|
|
|
if (is_object($assoc_array)) {
|
|
|
$assoc_arr = array();
|
|
@@ -110,14 +108,20 @@ class kvflush {
|
|
|
}
|
|
|
}
|
|
|
$ret = TRUE;
|
|
|
+ $mem = gMem();
|
|
|
if (count($assoc_arr) > 0) {
|
|
|
$mem->delete($key);
|
|
|
$ret = $mem->hmset($key, $assoc_array); # 写入
|
|
|
}
|
|
|
-// $mem->close();
|
|
|
return $ret;
|
|
|
}
|
|
|
|
|
|
+// <editor-fold defaultstate="collapsed" desc=" 私有方法 ">
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取输出路径
|
|
|
+ * @return type
|
|
|
+ */
|
|
|
private static function getFolder() {
|
|
|
if (defined('CodeGen_Folder')) {
|
|
|
if (!dir(CodeGen_Folder)) {
|
|
@@ -131,6 +135,11 @@ class kvflush {
|
|
|
return ROOTDIR . '/configs/data/';
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 输出到文件
|
|
|
+ * @param type $key
|
|
|
+ * @param type $value
|
|
|
+ */
|
|
|
private static function writePHPFile($key, $value) {
|
|
|
if (defined('CodeGen_Enabled') && CodeGen_Enabled) { # (部署环境)是否允许代码生成
|
|
|
$file = fopen(self::getFolder() . $key . ".php", 'w');
|
|
@@ -140,6 +149,11 @@ class kvflush {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 向文件中输出一个字符串
|
|
|
+ * @param type $key
|
|
|
+ * @param type $value
|
|
|
+ */
|
|
|
private static function FlushToFile_str($key, $value) {
|
|
|
if ($key == "gamecfg-client") {
|
|
|
self::writePHPFile($key, $value);
|
|
@@ -148,13 +162,17 @@ class kvflush {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 向文件中输入一个hash对象
|
|
|
+ * @param type $key
|
|
|
+ * @param type $assoc_array
|
|
|
+ */
|
|
|
private static function FlushToFile_hash($key, $assoc_array) {
|
|
|
self::writePHPFile($key, $assoc_array);
|
|
|
}
|
|
|
|
|
|
+// </editor-fold>
|
|
|
}
|
|
|
|
|
|
-//exit("success");
|
|
|
-
|
|
|
HttpUtil::PostOnly();
|
|
|
kvflush::flush(); # do it
|