123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- <?php
- 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 基础功能, 没有安全功能.
- * @author gwang email:wanggangzero@qq.com
- * @copyright © 2015-12-1, SJZ LoyalSoft Corporation & gwang. All rights reserved.
- */
- /**
- * Description of kvflush
- * 写一个key=>value对到目标CMEM
- * @author gwang
- */
- class kvflush {
- public static function flush() {
- InitZoneId(); # 初始化分区信息 Ps. $_REQUEST["zoneid"]
- $params = HttpUtil::getQueryParas();
- $key = CommUtil::zb64decode(urldecode($params["key"]));
- $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']);
- 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!";
- }
- }
- unset($myrsa);
- }
- //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();
- return $ret;
- }
- /**
- * 普通写入方法
- * @param string $key
- * @param mixed $value
- * @return boolean
- */
- public static function FlushToMem_set($key, $value) {
- $mem = gMem();
- $mem->delete($key);
- $ret = $mem->set($key, $value); # 写入mem
- $mem->close();
- return $ret;
- }
- /**
- * 写入哈希表
- * @param string $key
- * @param obj/assoc_arr $assoc_array
- * @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();
- foreach ($assoc_array as $k => $v) { # 组合成符合hmset的关联数组
- $assoc_arr[$k] = JsonUtil::encode($v);
- }
- $assoc_array = $assoc_arr;
- } else {
- return false;
- }
- }
- $ret = TRUE;
- if (count($assoc_arr) > 0) {
- $mem->delete($key);
- $ret = $mem->hmset($key, $assoc_array); # 写入
- }
- $mem->close();
- return $ret;
- }
- private static function getFolder() {
- if (defined('CodeGen_Folder')) {
- if (!dir(CodeGen_Folder)) {
- if (mkdir(CodeGen_Folder)) {
- return CodeGen_Folder;
- }
- } else {
- return CodeGen_Folder;
- }
- }
- return ROOTDIR . '/configs/data/';
- }
- private static function writePHPFile($key, $value) {
- if (defined('CodeGen_Enabled') && CodeGen_Enabled) { # (部署环境)是否允许代码生成
- $file = fopen(self::getFolder() . $key . ".php", 'w');
- $str = "<?php " . PHP_EOL . " return unserialize(gzinflate(base64_decode('" . base64_encode(gzdeflate(serialize($value), 9)) . "')));";
- fwrite($file, $str);
- fclose($file);
- }
- }
- private static function FlushToFile_str($key, $value) {
- if ($key == "gamecfg-client") {
- self::writePHPFile($key, $value);
- } else {
- self::writePHPFile($key, JsonUtil::decode($value));
- }
- }
- private static function FlushToFile_hash($key, $assoc_array) {
- self::writePHPFile($key, $assoc_array);
- }
- }
- //exit("success");
- HttpUtil::PostOnly();
- kvflush::flush(); # do it
|