kvflush.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <?php
  2. namespace loyalsoft;
  3. include_once __DIR__ . '/../../main.php';
  4. require_once ROOTDIR . '/util/OpenSSLVerify.php'; # Ps. 这个文件和类名没有对应关系.
  5. define("CLOGUTIL_DEBUG", true);
  6. /**
  7. * Description of config
  8. * 数据中转功能.
  9. * 通过远程地址向服务器刷入Cmem的key-value数据. key和value通过gzcompress和base64处理.
  10. * @version
  11. * 1.0.1 通过openssl,RSA验证发送方具有刷数据的权限.
  12. * 1.0.0 基础功能, 没有安全功能.
  13. * @author gwang email:wanggangzero@qq.com
  14. * @copyright © 2015-12-1, SJZ LoyalSoft Corporation & gwang. All rights reserved.
  15. */
  16. /**
  17. * Description of kvflush
  18. * 写一个key=>value对到目标CMEM
  19. * @author gwang
  20. */
  21. class kvflush {
  22. public static function flush() {
  23. InitZoneId(); # 初始化分区信息 Ps. $_REQUEST["zoneid"]
  24. $params = HttpUtil::getQueryParas();
  25. $key = CommUtil::zb64decode(urldecode($params["key"]));
  26. $val = CommUtil::zb64decode(urldecode($params["val"]));
  27. $user = urldecode($params["user"]);
  28. $type = urldecode($params['type']);
  29. $keypath = ROOTDIR . "/util/key";
  30. $myrsa = new MyRsa($keypath);
  31. $sign = urldecode($params['sign']);
  32. if (!$myrsa->verify_arr($params, $sign)) { # 验证下签名
  33. echo "签名验证失败!";
  34. } else {
  35. CLog::info($key . " " . $val, "刷数据");
  36. switch ($type) {
  37. case 'hash':
  38. $val = json_decode($val); # 需要还原为Obj才能解开
  39. $ret = self::FlushToMem_hmSet($key, $val);
  40. self::FlushToFile_hash($key, $val);
  41. break;
  42. case 'normal':
  43. $ret = self::FlushToMem_set($key, $val);
  44. self::FlushToFile_str($key, $val);
  45. break;
  46. default :
  47. $ret = self::FlushToMem_set($key, $val);
  48. break;
  49. }
  50. if ($ret) {
  51. echo "success";
  52. self::log($user, $key); # 记录日志
  53. } else {
  54. echo "[$key] flush to mem failed!";
  55. }
  56. }
  57. unset($myrsa);
  58. }
  59. //put your code here
  60. static function log($user, $modelname) {
  61. $who = $user . '_' . HttpUtil::clientIP();
  62. $key = "log-flush";
  63. // CLog::warn($who . "flushing [$modelname]", __CLASS__); # 写文件
  64. $mem = gMem();
  65. $ret = $mem->hset($key, $who, TimeUtil::tsYmdHis()); # 写入mem
  66. $mem->close();
  67. return $ret;
  68. }
  69. /**
  70. * 普通写入方法
  71. * @param string $key
  72. * @param mixed $value
  73. * @return boolean
  74. */
  75. public static function FlushToMem_set($key, $value) {
  76. $mem = gMem();
  77. $mem->delete($key);
  78. $ret = $mem->set($key, $value); # 写入mem
  79. $mem->close();
  80. return $ret;
  81. }
  82. /**
  83. * 写入哈希表
  84. * @param string $key
  85. * @param obj/assoc_arr $assoc_array
  86. * @return type
  87. */
  88. public static function FlushToMem_hmSet($key, $assoc_array) {
  89. $mem = gMem();
  90. if (!is_array($assoc_array)) {
  91. if (is_object($assoc_array)) {
  92. $assoc_arr = array();
  93. foreach ($assoc_array as $k => $v) { # 组合成符合hmset的关联数组
  94. $assoc_arr[$k] = JsonUtil::encode($v);
  95. }
  96. $assoc_array = $assoc_arr;
  97. } else {
  98. return false;
  99. }
  100. }
  101. $ret = TRUE;
  102. if (count($assoc_arr) > 0) {
  103. $mem->delete($key);
  104. $ret = $mem->hmset($key, $assoc_array); # 写入
  105. }
  106. $mem->close();
  107. return $ret;
  108. }
  109. private static function getFolder() {
  110. if (defined('CodeGen_Folder')) {
  111. if (!dir(CodeGen_Folder)) {
  112. if (mkdir(CodeGen_Folder)) {
  113. return CodeGen_Folder;
  114. }
  115. } else {
  116. return CodeGen_Folder;
  117. }
  118. }
  119. return ROOTDIR . '/configs/data/';
  120. }
  121. private static function writePHPFile($key, $value) {
  122. if (defined('CodeGen_Enabled') && CodeGen_Enabled) { # (部署环境)是否允许代码生成
  123. $file = fopen(self::getFolder() . $key . ".php", 'w');
  124. $str = "<?php " . PHP_EOL . " return unserialize(gzinflate(base64_decode('" . base64_encode(gzdeflate(serialize($value), 9)) . "')));";
  125. fwrite($file, $str);
  126. fclose($file);
  127. }
  128. }
  129. private static function FlushToFile_str($key, $value) {
  130. if ($key == "gamecfg-client") {
  131. self::writePHPFile($key, $value);
  132. } else {
  133. self::writePHPFile($key, JsonUtil::decode($value));
  134. }
  135. }
  136. private static function FlushToFile_hash($key, $assoc_array) {
  137. self::writePHPFile($key, $assoc_array);
  138. }
  139. }
  140. //exit("success");
  141. HttpUtil::PostOnly();
  142. kvflush::flush(); # do it