StatProc.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. <?php
  2. namespace loyalsoft;
  3. //
  4. ///**
  5. // * 统计模块
  6. // * 统计:反应的是一段时间内的趋势. 所以,所有数据都要依据时间进行分类. 其他的统计维度另算. -王刚
  7. // * @version
  8. // * 1.0.0 Created at 2016-5-24. by --gwang
  9. // * @author gwang (mail@wanggangzero.cn)
  10. // * @copyright © 2016-5-24, SJZ LoyalSoft Corporation & gwang. All rights reserved.
  11. // */
  12. //class StatProc {
  13. //
  14. // public static function test($req) {
  15. // CLog::info("异步测试成功!", "Statproc::Test");
  16. // DebugHelper::var_dump("异步调用");
  17. // return $req;
  18. // }
  19. //
  20. // const maxLevel = 100;
  21. // const maxDays = 30;
  22. //
  23. // /**
  24. // * 玩家登录
  25. // * @param type $level
  26. // */
  27. // public static function UserLogin($req, $isNew = 0) {
  28. // $redis = gMem();
  29. // $redis->hincrby(MemKey_Stat::UserLevel_hash(), $level);
  30. // }
  31. //
  32. // /**
  33. // * 设置新手引导步骤
  34. // * @param int $tsBirth 玩家创建角色的时刻
  35. // * @param int $zoneid
  36. // * @param int $tarStep
  37. // * @param int $currentStep
  38. // */
  39. // public static function UserGuidStep($tsBirth, $zoneid, $tarStep, $currentStep) {
  40. // if ($tarStep == $currentStep) {
  41. // return;
  42. // }
  43. // $redis = gMem();
  44. //
  45. // if ($tarStep == 0) { # 跳过新手引导
  46. // $redis->hincrby(MemKey_Stat::UserGuidSkip_Day($tsBirth, $zoneid), $currentStep);
  47. // $redis->hincrby(MemKey_Stat::UserGuidSkip_Week($tsBirth, $zoneid), $currentStep);
  48. // $redis->hincrby(MemKey_Stat::UserGuidSkip_Month($tsBirth, $zoneid), $currentStep);
  49. // } else {
  50. // $redis->hincrby(MemKey_Stat::UserGuidLose_Day($tsBirth, $zoneid), $tarStep);
  51. // $redis->hincrby(MemKey_Stat::UserGuidLose_Week($tsBirth, $zoneid), $tarStep);
  52. // $redis->hincrby(MemKey_Stat::UserGuidLose_Month($tsBirth, $zoneid), $tarStep);
  53. // }
  54. // }
  55. //
  56. // /**
  57. // * 任务步骤
  58. // * @param int $tsBirth
  59. // * @param int $level
  60. // * @param int $completeStep
  61. // */
  62. // public static function TaskStep($tsBirth, $level, $completeStep) {
  63. // $redis = gMem();
  64. // $redis->zincrby(MemKey_Stat::TaskStep_zset(), $completeStep);
  65. // $redis->zincrby(MemKey_Stat::TaskStep_Day_zset($tsBirth), $completeStep);
  66. // $redis->zincrby(MemKey_Stat::TaskStep_level_zset($level), $completeStep);
  67. // }
  68. //
  69. // /**
  70. // * 首次充值
  71. // * @param string $uid 玩家ID
  72. // * @param int $tsBirth
  73. // * @param int $level
  74. // * @param int $amt 充值金额单位0.1元
  75. // */
  76. // public static function Pay($uid, $tsBirth, $level, $amt) {
  77. // if ($amt <= 0) {
  78. // return;
  79. // }
  80. // $redis = gMem();
  81. // $day = CommUtil::tsDay() - CommUtil::tsDay($tsBirth);
  82. // $day = $day > self::maxDays ? self::maxDays : $day; # 超过30天的合并到30天
  83. // if ($redis->sismember(MemKey_Stat::PayedUsers(), $uid)) {
  84. //// # 充值统计这边暂空,还没设计好需求
  85. // } else { # 首充
  86. // $redis->zincrby(MemKey_Stat::FirstPay_level_zset(), $level); # 首次充值等级
  87. // $redis->zincrby(MemKey_Stat::FirstPay_day_zset(), $day); # 首次充值的游戏时间
  88. // $redis->sadd($uid, $uid);
  89. // }
  90. // usleep(1); # 延时1微秒
  91. // }
  92. //
  93. // /**
  94. // * 统计 - 商城购买
  95. // * @param string $zoneid
  96. // * @param string $uid 玩家ID
  97. // * @param int $itemid 道具编号
  98. // * @param int $amt 数量
  99. // */
  100. // public static function shopbuy($zoneid, $uid, $itemid, $amt = 1) {
  101. // if ($amt <= 0) {
  102. // return;
  103. // }
  104. // $redis = gMem();
  105. // # 全局
  106. // $redis->zincrby(MemKey_GameRun::stat_daily_ShopSales_zset($zoneid, TimeUtil::dtToday()), $itemid, $amt);
  107. // $redis->zincrby(MemKey_GameRun::stat_weekly_ShopSales_zset($zoneid, TimeUtil::tsWeek()), $itemid, $amt);
  108. // $redis->zincrby(MemKey_GameRun::stat_monthly_ShopSales_zset($zoneid, date('Ym')), $itemid, $amt);
  109. // $redis->lpush(MemKey_GameRun::log_ShopSales_list($zoneid), "[" . TimeUtil::dtCurrent() . "] $uid,$itemid,$amt");
  110. // $redis->ltrim(MemKey_GameRun::log_ShopSales_list($zoneid), 0, 1000); # 系统销售日志保留1k条
  111. // # 玩家
  112. // $redis->zincrby(MemKey_User::stat_Shopbuy_zset($zoneid, $uid), $itemid, $amt);
  113. // $redis->lpush(MemKey_User::log_shopbuy_list($zoneid, $uid), "[" . TimeUtil::dtCurrent() . "] $itemid,$amt");
  114. // $redis->ltrim(MemKey_User::log_shopbuy_list($zoneid, $uid), 0, 30); # 保持最新的30条记录
  115. // usleep(1); # 延时1微秒
  116. // }
  117. //
  118. // /**
  119. // * 统计 - 神秘商城购买
  120. // * @param type $zoneid
  121. // * @param type $uid
  122. // * @param type $itemid
  123. // * @param type $amt
  124. // */
  125. // public static function secretShopbuy($zoneid, $uid, $itemid, $amt = 1) {
  126. // if ($amt <= 0) {
  127. // return;
  128. // }
  129. // $redis = gMem();
  130. // # 全局
  131. // $redis->zincrby(MemKey_GameRun::stat_daily_secretshopSales_zset($zoneid, TimeUtil::dtToday()), $itemid, $amt);
  132. // $redis->zincrby(MemKey_GameRun::stat_weekly_secretshopSalse_zset($zoneid, TimeUtil::tsWeek()), $itemid, $amt);
  133. // $redis->zincrby(MemKey_GameRun::stat_monthly_secretshopSales_zset($zoneid, date('Ym')), $itemid, $amt);
  134. // $redis->lpush(MemKey_GameRun::log_secretshopSales_list($zoneid), "[" . TimeUtil::dtCurrent() . "] $uid,$itemid,$amt");
  135. // $redis->ltrim(MemKey_GameRun::log_secretshopSales_list($zoneid), 0, 1000); # 系统销售日志保留1k条
  136. // # 玩家
  137. // $redis->zincrby(MemKey_User::stat_SecretShopBuy_zset($zoneid, $uid), $itemid, $amt);
  138. // $redis->lpush(MemKey_User::log_secretshopbuy_list($zoneid, $uid), # # 玩家个人日志
  139. // "[" . TimeUtil::dtCurrent() . "] $itemid,$amt");
  140. // $redis->ltrim(MemKey_User::log_secretshopbuy_list($zoneid, $uid), 0, 30); # 保持最新的30条记录
  141. // usleep(1);
  142. // }
  143. //
  144. //// == == == == == == == == == == == == == ==
  145. //// 提供查询功能
  146. //// == == == == == == == == == == == == == ==
  147. //
  148. // /**
  149. // *
  150. // * @param StatRequest $req
  151. // * @return type
  152. // */
  153. // public static function GetDataOfTask($req) {
  154. // $redis = gMem();
  155. // $maxTaskStep = 1000; # 暂时不高于1000
  156. // switch ($req->dateType) { # 参数处理
  157. // case 'none':
  158. // $data = $redis->zrevrange(MemKey_Stat::TaskStep_zset(), 0, $maxTaskStep, true);
  159. // break;
  160. // case 'Day':
  161. // $ts = ($req->dateIndex > 30 ? 30 : $req->dateIndex) * 86400;
  162. // $data = $redis->zrevrange(MemKey_Stat::TaskStep_Day_zset(CommUtil::tsCurrent(-$ts)), 0, self::maxDays, true);
  163. // break;
  164. // case 'level':
  165. // $data = $redis->zrevrange(MemKey_Stat::TaskStep_level_zset($req->dateIndex), 0, self::maxLevel, true);
  166. // break;
  167. // default :
  168. // break;
  169. // }
  170. // $keys = array_keys($data);
  171. // sort($keys);
  172. // return array(
  173. // 'labels' => $keys,
  174. // 'datasets' => array(
  175. // array('label' => '完成人数',
  176. // 'fillColor' => "rgba(220, 220, 220, 0.5)", 'strokeColor' => "rgba(220, 220, 220, 1)",
  177. // 'data' => array_values(StlUtil::arraySortByKey($data))
  178. // )
  179. // )
  180. // );
  181. // }
  182. //
  183. // /**
  184. // *
  185. // * @param StatRequest $req
  186. // * @return type
  187. // */
  188. // public static function GetUserGuideData($req) {
  189. // $redis = gMem();
  190. // $date = date_create_from_format("Ymd", $req->dateIndex); # 参数处理
  191. // $ts = $date->getTimestamp();
  192. // $zoneid = $req->zoneid;
  193. ////
  194. // $skip = $redis->hgetall(MemKey_Stat::UserGuidSkip_Day($ts, $zoneid));
  195. // $lose = $redis->hgetall(MemKey_Stat::UserGuidLose_Day($ts, $zoneid));
  196. //
  197. // switch ($req->dateType) {
  198. // case 'Week':
  199. // $skip = $redis->hgetall(MemKey_Stat::UserGuidSkip_Week($ts, $zoneid));
  200. // $lose = $redis->hgetall(MemKey_Stat::UserGuidLose_Week($ts, $zoneid));
  201. // break;
  202. // case 'Month':
  203. // $skip = $redis->hgetall(MemKey_Stat::UserGuidSkip_Month($ts, $zoneid));
  204. // $lose = $redis->hgetall(MemKey_Stat::UserGuidLose_Month($ts, $zoneid));
  205. // break;
  206. // case 'Day':
  207. // default:
  208. // break;
  209. // }
  210. // $keys = array_keys($lose);
  211. // foreach ($keys as $k) {
  212. // if ($k && !isset($skip[$k])) {
  213. // $skip[$k] = "0";
  214. // }
  215. // }
  216. //
  217. // sort($keys);
  218. // return array(
  219. // 'labels' => $keys,
  220. // 'datasets' => array(
  221. // array('label' => '完成人数',
  222. // 'fillColor' => "rgba(220, 220, 220, 0.5)", 'strokeColor' => "rgba(220, 220, 220, 1)",
  223. // 'data' => array_values(StlUtil::arraySortByKey($lose))
  224. // ),
  225. // array('label' => '跳过人数',
  226. // 'fillColor' => "rgba(220, 220, 220, 0.5)", 'strokeColor' => "rgba(220, 220, 220, 1)",
  227. // 'borderColor' => 'rgb(0, 0, 255)',
  228. // 'data' => array_values(StlUtil::arraySortByKey($skip))
  229. // ),
  230. // )
  231. // );
  232. // }
  233. //
  234. // /**
  235. // * 付费相关统计
  236. // * @param StatRequest $req
  237. // */
  238. // public static function GetPayStatData($req) {
  239. // $redis = gMem();
  240. //// 参数处理
  241. // $payedusers = $redis->scard(MemKey_Stat::PayedUsers()); # 充值总人数
  242. // $label = '';
  243. // switch ($req->dateType) {
  244. // case 'FirstPayDay':
  245. // $data = $redis->zrange(MemKey_Stat::FirstPay_day_zset(), 0, self::maxDays, true);
  246. // $label = '消费人数';
  247. // break;
  248. // case 'FirstPayLevel':
  249. // $data = $redis->zrange(MemKey_Stat::FirstPay_level_zset(), 0, self::maxLevel, true);
  250. // $label = '充值人数';
  251. // break;
  252. // case 'FirstYuanbaoPayAt':
  253. // $data = $redis->zrange(MemKey_Stat::YuanbaoFirstUsed_zset(), 0, -1, true); # 最多也不过5、6中可能流向
  254. // $label = '消费人数';
  255. // break;
  256. // default :
  257. //
  258. // break;
  259. // }
  260. // $keys = array_keys($data);
  261. // sort($keys);
  262. // return array(
  263. // 'labels' => $keys,
  264. // 'datasets' => array(
  265. // array('label' => $label,
  266. // 'fillColor' => "rgba(220, 220, 220, 0.5)", 'strokeColor' => "rgba(220, 220, 220, 1)",
  267. // 'data' => array_values(StlUtil::arraySortByKey($data))
  268. // )
  269. // )
  270. // );
  271. // }
  272. //
  273. // /**
  274. // * 玩家流失等级
  275. // * @param type $req
  276. // * @return type
  277. // */
  278. // public static function GetUserLevels($req) {
  279. // $redis = gMem();
  280. // $data = $redis->hgetall(MemKey_Stat::UserLevel_hash());
  281. // $keys = array_keys($data);
  282. // sort($keys);
  283. // return array(
  284. // 'labels' => $keys,
  285. // 'datasets' => array(
  286. // array('label' => '到达该等级的人数',
  287. // 'fillColor' => "rgba(220, 220, 220, 0.5)", 'strokeColor' => "rgba(220, 220, 220, 1)",
  288. // 'data' => array_values(StlUtil::arraySortByKey($data))
  289. // )
  290. // )
  291. // );
  292. // }
  293. //
  294. //}
  295. //
  296. ///**
  297. // * 统计类型
  298. // */
  299. //class StatClass {
  300. //
  301. //// 新手引导
  302. // const UserGuide = 1;
  303. //// 任务步骤
  304. // const TaskStep = 2;
  305. //// 流失等级
  306. // const LoseLevel = 3;
  307. //// 生存天数
  308. // const LiveDays = 4;
  309. // // 付费相关统计
  310. // const PayStat = 5;
  311. //
  312. //}
  313. //
  314. //class StatRequest {
  315. //
  316. // public $statType;
  317. // public $dateType;
  318. // public $dateIndex;
  319. // public $zoneid;
  320. // public $level;
  321. //
  322. //}