123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324 |
- <?php
- namespace loyalsoft;
- //
- ///**
- // * 统计模块
- // * 统计:反应的是一段时间内的趋势. 所以,所有数据都要依据时间进行分类. 其他的统计维度另算. -王刚
- // * @version
- // * 1.0.0 Created at 2016-5-24. by --gwang
- // * @author gwang (mail@wanggangzero.cn)
- // * @copyright © 2016-5-24, SJZ LoyalSoft Corporation & gwang. All rights reserved.
- // */
- //class StatProc {
- //
- // public static function test($req) {
- // CLog::info("异步测试成功!", "Statproc::Test");
- // DebugHelper::var_dump("异步调用");
- // return $req;
- // }
- //
- // const maxLevel = 100;
- // const maxDays = 30;
- //
- // /**
- // * 玩家登录
- // * @param type $level
- // */
- // public static function UserLogin($req, $isNew = 0) {
- // $redis = gMem();
- // $redis->hincrby(MemKey_Stat::UserLevel_hash(), $level);
- // }
- //
- // /**
- // * 设置新手引导步骤
- // * @param int $tsBirth 玩家创建角色的时刻
- // * @param int $zoneid
- // * @param int $tarStep
- // * @param int $currentStep
- // */
- // public static function UserGuidStep($tsBirth, $zoneid, $tarStep, $currentStep) {
- // if ($tarStep == $currentStep) {
- // return;
- // }
- // $redis = gMem();
- //
- // if ($tarStep == 0) { # 跳过新手引导
- // $redis->hincrby(MemKey_Stat::UserGuidSkip_Day($tsBirth, $zoneid), $currentStep);
- // $redis->hincrby(MemKey_Stat::UserGuidSkip_Week($tsBirth, $zoneid), $currentStep);
- // $redis->hincrby(MemKey_Stat::UserGuidSkip_Month($tsBirth, $zoneid), $currentStep);
- // } else {
- // $redis->hincrby(MemKey_Stat::UserGuidLose_Day($tsBirth, $zoneid), $tarStep);
- // $redis->hincrby(MemKey_Stat::UserGuidLose_Week($tsBirth, $zoneid), $tarStep);
- // $redis->hincrby(MemKey_Stat::UserGuidLose_Month($tsBirth, $zoneid), $tarStep);
- // }
- // }
- //
- // /**
- // * 任务步骤
- // * @param int $tsBirth
- // * @param int $level
- // * @param int $completeStep
- // */
- // public static function TaskStep($tsBirth, $level, $completeStep) {
- // $redis = gMem();
- // $redis->zincrby(MemKey_Stat::TaskStep_zset(), $completeStep);
- // $redis->zincrby(MemKey_Stat::TaskStep_Day_zset($tsBirth), $completeStep);
- // $redis->zincrby(MemKey_Stat::TaskStep_level_zset($level), $completeStep);
- // }
- //
- // /**
- // * 首次充值
- // * @param string $uid 玩家ID
- // * @param int $tsBirth
- // * @param int $level
- // * @param int $amt 充值金额单位0.1元
- // */
- // public static function Pay($uid, $tsBirth, $level, $amt) {
- // if ($amt <= 0) {
- // return;
- // }
- // $redis = gMem();
- // $day = CommUtil::tsDay() - CommUtil::tsDay($tsBirth);
- // $day = $day > self::maxDays ? self::maxDays : $day; # 超过30天的合并到30天
- // if ($redis->sismember(MemKey_Stat::PayedUsers(), $uid)) {
- //// # 充值统计这边暂空,还没设计好需求
- // } else { # 首充
- // $redis->zincrby(MemKey_Stat::FirstPay_level_zset(), $level); # 首次充值等级
- // $redis->zincrby(MemKey_Stat::FirstPay_day_zset(), $day); # 首次充值的游戏时间
- // $redis->sadd($uid, $uid);
- // }
- // usleep(1); # 延时1微秒
- // }
- //
- // /**
- // * 统计 - 商城购买
- // * @param string $zoneid
- // * @param string $uid 玩家ID
- // * @param int $itemid 道具编号
- // * @param int $amt 数量
- // */
- // public static function shopbuy($zoneid, $uid, $itemid, $amt = 1) {
- // if ($amt <= 0) {
- // return;
- // }
- // $redis = gMem();
- // # 全局
- // $redis->zincrby(MemKey_GameRun::stat_daily_ShopSales_zset($zoneid, TimeUtil::dtToday()), $itemid, $amt);
- // $redis->zincrby(MemKey_GameRun::stat_weekly_ShopSales_zset($zoneid, TimeUtil::tsWeek()), $itemid, $amt);
- // $redis->zincrby(MemKey_GameRun::stat_monthly_ShopSales_zset($zoneid, date('Ym')), $itemid, $amt);
- // $redis->lpush(MemKey_GameRun::log_ShopSales_list($zoneid), "[" . TimeUtil::dtCurrent() . "] $uid,$itemid,$amt");
- // $redis->ltrim(MemKey_GameRun::log_ShopSales_list($zoneid), 0, 1000); # 系统销售日志保留1k条
- // # 玩家
- // $redis->zincrby(MemKey_User::stat_Shopbuy_zset($zoneid, $uid), $itemid, $amt);
- // $redis->lpush(MemKey_User::log_shopbuy_list($zoneid, $uid), "[" . TimeUtil::dtCurrent() . "] $itemid,$amt");
- // $redis->ltrim(MemKey_User::log_shopbuy_list($zoneid, $uid), 0, 30); # 保持最新的30条记录
- // usleep(1); # 延时1微秒
- // }
- //
- // /**
- // * 统计 - 神秘商城购买
- // * @param type $zoneid
- // * @param type $uid
- // * @param type $itemid
- // * @param type $amt
- // */
- // public static function secretShopbuy($zoneid, $uid, $itemid, $amt = 1) {
- // if ($amt <= 0) {
- // return;
- // }
- // $redis = gMem();
- // # 全局
- // $redis->zincrby(MemKey_GameRun::stat_daily_secretshopSales_zset($zoneid, TimeUtil::dtToday()), $itemid, $amt);
- // $redis->zincrby(MemKey_GameRun::stat_weekly_secretshopSalse_zset($zoneid, TimeUtil::tsWeek()), $itemid, $amt);
- // $redis->zincrby(MemKey_GameRun::stat_monthly_secretshopSales_zset($zoneid, date('Ym')), $itemid, $amt);
- // $redis->lpush(MemKey_GameRun::log_secretshopSales_list($zoneid), "[" . TimeUtil::dtCurrent() . "] $uid,$itemid,$amt");
- // $redis->ltrim(MemKey_GameRun::log_secretshopSales_list($zoneid), 0, 1000); # 系统销售日志保留1k条
- // # 玩家
- // $redis->zincrby(MemKey_User::stat_SecretShopBuy_zset($zoneid, $uid), $itemid, $amt);
- // $redis->lpush(MemKey_User::log_secretshopbuy_list($zoneid, $uid), # # 玩家个人日志
- // "[" . TimeUtil::dtCurrent() . "] $itemid,$amt");
- // $redis->ltrim(MemKey_User::log_secretshopbuy_list($zoneid, $uid), 0, 30); # 保持最新的30条记录
- // usleep(1);
- // }
- //
- //// == == == == == == == == == == == == == ==
- //// 提供查询功能
- //// == == == == == == == == == == == == == ==
- //
- // /**
- // *
- // * @param StatRequest $req
- // * @return type
- // */
- // public static function GetDataOfTask($req) {
- // $redis = gMem();
- // $maxTaskStep = 1000; # 暂时不高于1000
- // switch ($req->dateType) { # 参数处理
- // case 'none':
- // $data = $redis->zrevrange(MemKey_Stat::TaskStep_zset(), 0, $maxTaskStep, true);
- // break;
- // case 'Day':
- // $ts = ($req->dateIndex > 30 ? 30 : $req->dateIndex) * 86400;
- // $data = $redis->zrevrange(MemKey_Stat::TaskStep_Day_zset(CommUtil::tsCurrent(-$ts)), 0, self::maxDays, true);
- // break;
- // case 'level':
- // $data = $redis->zrevrange(MemKey_Stat::TaskStep_level_zset($req->dateIndex), 0, self::maxLevel, true);
- // break;
- // default :
- // break;
- // }
- // $keys = array_keys($data);
- // sort($keys);
- // return array(
- // 'labels' => $keys,
- // 'datasets' => array(
- // array('label' => '完成人数',
- // 'fillColor' => "rgba(220, 220, 220, 0.5)", 'strokeColor' => "rgba(220, 220, 220, 1)",
- // 'data' => array_values(StlUtil::arraySortByKey($data))
- // )
- // )
- // );
- // }
- //
- // /**
- // *
- // * @param StatRequest $req
- // * @return type
- // */
- // public static function GetUserGuideData($req) {
- // $redis = gMem();
- // $date = date_create_from_format("Ymd", $req->dateIndex); # 参数处理
- // $ts = $date->getTimestamp();
- // $zoneid = $req->zoneid;
- ////
- // $skip = $redis->hgetall(MemKey_Stat::UserGuidSkip_Day($ts, $zoneid));
- // $lose = $redis->hgetall(MemKey_Stat::UserGuidLose_Day($ts, $zoneid));
- //
- // switch ($req->dateType) {
- // case 'Week':
- // $skip = $redis->hgetall(MemKey_Stat::UserGuidSkip_Week($ts, $zoneid));
- // $lose = $redis->hgetall(MemKey_Stat::UserGuidLose_Week($ts, $zoneid));
- // break;
- // case 'Month':
- // $skip = $redis->hgetall(MemKey_Stat::UserGuidSkip_Month($ts, $zoneid));
- // $lose = $redis->hgetall(MemKey_Stat::UserGuidLose_Month($ts, $zoneid));
- // break;
- // case 'Day':
- // default:
- // break;
- // }
- // $keys = array_keys($lose);
- // foreach ($keys as $k) {
- // if ($k && !isset($skip[$k])) {
- // $skip[$k] = "0";
- // }
- // }
- //
- // sort($keys);
- // return array(
- // 'labels' => $keys,
- // 'datasets' => array(
- // array('label' => '完成人数',
- // 'fillColor' => "rgba(220, 220, 220, 0.5)", 'strokeColor' => "rgba(220, 220, 220, 1)",
- // 'data' => array_values(StlUtil::arraySortByKey($lose))
- // ),
- // array('label' => '跳过人数',
- // 'fillColor' => "rgba(220, 220, 220, 0.5)", 'strokeColor' => "rgba(220, 220, 220, 1)",
- // 'borderColor' => 'rgb(0, 0, 255)',
- // 'data' => array_values(StlUtil::arraySortByKey($skip))
- // ),
- // )
- // );
- // }
- //
- // /**
- // * 付费相关统计
- // * @param StatRequest $req
- // */
- // public static function GetPayStatData($req) {
- // $redis = gMem();
- //// 参数处理
- // $payedusers = $redis->scard(MemKey_Stat::PayedUsers()); # 充值总人数
- // $label = '';
- // switch ($req->dateType) {
- // case 'FirstPayDay':
- // $data = $redis->zrange(MemKey_Stat::FirstPay_day_zset(), 0, self::maxDays, true);
- // $label = '消费人数';
- // break;
- // case 'FirstPayLevel':
- // $data = $redis->zrange(MemKey_Stat::FirstPay_level_zset(), 0, self::maxLevel, true);
- // $label = '充值人数';
- // break;
- // case 'FirstYuanbaoPayAt':
- // $data = $redis->zrange(MemKey_Stat::YuanbaoFirstUsed_zset(), 0, -1, true); # 最多也不过5、6中可能流向
- // $label = '消费人数';
- // break;
- // default :
- //
- // break;
- // }
- // $keys = array_keys($data);
- // sort($keys);
- // return array(
- // 'labels' => $keys,
- // 'datasets' => array(
- // array('label' => $label,
- // 'fillColor' => "rgba(220, 220, 220, 0.5)", 'strokeColor' => "rgba(220, 220, 220, 1)",
- // 'data' => array_values(StlUtil::arraySortByKey($data))
- // )
- // )
- // );
- // }
- //
- // /**
- // * 玩家流失等级
- // * @param type $req
- // * @return type
- // */
- // public static function GetUserLevels($req) {
- // $redis = gMem();
- // $data = $redis->hgetall(MemKey_Stat::UserLevel_hash());
- // $keys = array_keys($data);
- // sort($keys);
- // return array(
- // 'labels' => $keys,
- // 'datasets' => array(
- // array('label' => '到达该等级的人数',
- // 'fillColor' => "rgba(220, 220, 220, 0.5)", 'strokeColor' => "rgba(220, 220, 220, 1)",
- // 'data' => array_values(StlUtil::arraySortByKey($data))
- // )
- // )
- // );
- // }
- //
- //}
- //
- ///**
- // * 统计类型
- // */
- //class StatClass {
- //
- //// 新手引导
- // const UserGuide = 1;
- //// 任务步骤
- // const TaskStep = 2;
- //// 流失等级
- // const LoseLevel = 3;
- //// 生存天数
- // const LiveDays = 4;
- // // 付费相关统计
- // const PayStat = 5;
- //
- //}
- //
- //class StatRequest {
- //
- // public $statType;
- // public $dateType;
- // public $dateIndex;
- // public $zoneid;
- // public $level;
- //
- //}
|