| Server/eventdata/CommFunc.py | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Server/eventdata/ImportBakDailyActive.py | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| db/DBOper.php | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| serverrep/ImportAccountLoginpay.php | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
Server/eventdata/CommFunc.py
@@ -336,8 +336,14 @@ spfileFormat = "Event_%s-s" % spID logging.info("allServer=%s,serverIDList=%s,spfileFormat=%s" % (allServer, serverIDList, spfileFormat)) logloop = "logloop" in kv printloop = "printloop" in kv # 备份日期文件夹 for backupDateFile in os.listdir(backupPath): if logloop: logging.info("backupDateFile:%s" % backupDateFile) if printloop: print "backupDateFile:%s" % backupDateFile backupDateStr = backupDateFile[len("Event_"):] backupDatetime = strToDatetime(backupDateStr) if not checkDate(startDatetime, "", backupDatetime): @@ -399,6 +405,10 @@ from unrar import rarfile # 放在函数内,子服用不到此模块,这样就不需要安装此依赖了 # 备份分区文件夹 for backupServer in os.listdir(os.path.join(backupPath, backupDateFile)): if logloop: logging.info(" %s/%s" % (backupDateFile, backupServer)) if printloop: print " %s/%s" % (backupDateFile, backupServer) if not backupServer.endswith(".rar"): # 非rar文件的不处理 continue Server/eventdata/ImportBakDailyActive.py
New file @@ -0,0 +1,105 @@ #!/usr/bin/python # -*- coding: utf-8 -*- import CommFunc import ConfigParser import logging import mylog import json import os from unrar import rarfile cfg = ConfigParser.ConfigParser() cfg.read("../../InterfaceConfig.php") # 需要处理的流向名及顺序列表 DRNameList = ["LogInOut"] argvDict = {"spID": "hyyngame", "eventType": "ImportBakDailyActive", "queryCenterbak": 1, "allServer": 1, "startDate": "2024-05-01", } def queryAccountLoginoutInfo(argvDict): logging.info("queryAccountLoginoutInfo %s" % str(argvDict)) startDate = argvDict.get("startDate", "") endDate = argvDict.get("endDate", "") spID = argvDict.get("spID", "") # 查询中心备份的 # {"日期":{"AccID":[loginTime, logoutTime, IP], ...}, ...} loginoutDateAccIDInfo = {} if not CommFunc.loopCenterbakRarDR(cfg, startDate, endDate, argvDict, checkDrFileNeedParseFunc, parseLineFunc, loginoutDateAccIDInfo, drNameList=DRNameList, logloop=1, printloop=1): return logging.info("query all data OK") logging.info("%s" % loginoutDateAccIDInfo) content = json.dumps(loginoutDateAccIDInfo, ensure_ascii=False, default=lambda obj: obj.__dict__) with open('BakDailyActive.json', 'w') as file: file.write(content) # 将内容写入文件 print "save ok" logging.info("save ok") return def checkDrFileNeedParseFunc(drFileName, *parseArgs, **kv): ''' 检查流向是否需要处理 @param drFileName: 流向文件名 xxx_日期.txt @param *parseArgs: 自定义参数 @return: isNeed, checkNeedParseRetInfo ''' return True, None def parseLineFunc(drName, dateStr, checkNeedParseRetInfo, line, *parseArgs, **kv): ''' 解析流向行内容 @param drName: 流向名 @param dateStr: 对应日期字符串 @param checkNeedParseRetInfo: checkDrFileNeedParseFunc 返回的内容 @param line: 本行内容 @param *parseArgs: 自定义参数 ''' loginoutDateAccIDInfo = parseArgs[0] # 统计登录 if drName == "LogInOut": if "127.0.0.1" in line: #loginfo(" 脱机登录,不处理") return drDict = eval(line) accID = drDict["AccID"] if dateStr not in loginoutDateAccIDInfo: loginoutDateAccIDInfo[dateStr] = {} accIDDict = loginoutDateAccIDInfo[dateStr] if accID not in accIDDict: accIDDict[accID] = ["", "", ""] loginoutList = accIDDict[accID] if drDict["Type"] == "login": loginoutList[0] = drDict["LoginTime"] else: loginoutList[1] = drDict["LogoutTime"] loginoutList[2] = drDict["IP"] return def main(): CommFunc.setdefaultencoding() mylog.InitMyLog(argvDict.get("eventType", "")) queryAccountLoginoutInfo(argvDict) return if __name__ == "__main__": try: main() except: CommFunc.printExceptionError() os.system('pause') db/DBOper.php
@@ -286,7 +286,7 @@ } $dbName = GetDBName(); $ret = $conn->$dbName->$collectionName->remove($find); \Logging\LogInfo('Mongo Remove: $ret=' . $ret . ', find=' . print_r($find, true)); \Logging\LogInfo('Mongo Remove:' . $collectionName . ' $ret=' . $ret . ', find=' . print_r($find, true)); MongoDBPool::Close($conn); return true; } serverrep/ImportAccountLoginpay.php
@@ -17,7 +17,7 @@ echo "no appID"; exit(); } logweb("开始导入:" . $Channel); logweb("开始导入:" . $Channel . " opt:" . $opt); if (array_key_exists("reset", $_GET)) { logweb("重置重新导出:" . $Channel); $AccountFirstLoginOK = \DBOper\Remove("AccountFirstLogin", array("Channel" => $Channel)); @@ -42,12 +42,29 @@ } if (!$opt || $opt == "day") { logweb("daydaydaydayday:" . $Channel); impAccountDayActive(); impAccountDayActive("rar"); // impAccountDayActiveTestData(); } if (!$opt || $opt == "rep") { logweb("repreprepreprep:" . $Channel); // 重导日活、重刷报表;前提是先试用 /Server/eventdata/ImportBakDailyActive.py 运行导出中心流向备档日活数据结果保存到json文件 if ($opt == "reDayActive") { $AccountDayActiveOK = \DBOper\Remove("AccountDayActive", array("Channel" => $Channel)); logweb("AccountDayActiveOK:" . $AccountDayActiveOK); impAccountDayActive("json"); } if (!$opt || $opt == "rep" || $opt == "reDayActive") { logweb("开始导出每日报表:" . $Channel); if ($opt == "reDayActive") { $DailyReportOK = \DBOper\Remove("DailyReport", array("Channel" => $Channel)); $AccountFirstLoginReportOK = \DBOper\Remove("AccountFirstLoginReport", array("Channel" => $Channel)); $AccountFirstPayReportOK = \DBOper\Remove("AccountFirstPayReport", array("Channel" => $Channel)); $eventYMDOK = \DBOper\Remove("ServerEvent", array("Key" => "FirstKeepReportYMD_" . $Channel)); logweb("DailyReportOK:" . $DailyReportOK); logweb("AccountFirstLoginReportOK:" . $AccountFirstLoginReportOK); logweb("AccountFirstPayReportOK:" . $AccountFirstPayReportOK); logweb("eventYMDOK:" . $eventYMDOK); } \Report\CheckAndExportDailyReport($Channel); logweb("开始导出留存报表:" . $Channel); \Report\CheckAndExportFirstKeepReport($Channel); } logweb("处理完毕!"); @@ -234,7 +251,7 @@ echo "<hr/>"; } function impAccountDayActive() function impAccountDayActive($bakWay = "") { global $Channel; $startDate = $_GET["startDate"]; @@ -245,6 +262,7 @@ $allDateAccIDInfo = array(); // 所有记录 // 查询备份流向 if ($bakWay == "rar") { $pack_data = array(); $pack_data["spID"] = $Channel; $pack_data["eventType"] = "QueryAccountLoginOut"; @@ -259,16 +277,29 @@ $ret = json_decode($retStr, true); if (isset($ret)) { $allDateAccIDInfo = $ret[0]; ksort($allDateAccIDInfo); foreach ($allDateAccIDInfo as $dateStr => $accIDInfo) { logweb("中心流向备档日活数量:" . " dateStr:" . $dateStr . " count:" . count($accIDInfo)); // foreach ($accIDInfo as $accID => $loginoutInfo) { // logweb(" accID:" . $accID. json_encode($loginoutInfo)); // } } } else { logweb("query center backup error: " . $retStr); return; } } elseif ($bakWay == "json") { if (!\CommFunc\GetConfig("ServerInfo", "PlayerCenterRoot", $PlayerCenterRoot)) { return ""; } $jsonFile = $PlayerCenterRoot . "/Server/eventdata/BakDailyActive.json"; logweb("jsonFile:" . $jsonFile); if (!file_exists($jsonFile)) { logweb("###jsonFile is not exists:" . $jsonFile); return; } $allDateAccIDInfo = json_decode(file_get_contents($jsonFile), true); } if (!isset($allDateAccIDInfo)) { logweb("###center bak AccountDayActive error."); return; } ksort($allDateAccIDInfo); foreach ($allDateAccIDInfo as $dateStr => $accIDInfo) { logweb("中心流向备档日活数量:" . " dateStr:" . $dateStr . " count:" . count($accIDInfo)); } logweb("开始从子服导入日活数据! startDate:" . $startDate); @@ -326,7 +357,8 @@ ksort($allDateAccIDInfo); foreach ($allDateAccIDInfo as $dateStr => $accIDInfo) { logweb("最终日活数量:" . " dateStr:" . $dateStr . " count:" . count($accIDInfo)); logweb("日活游戏账号数量:" . " dateStr:" . $dateStr . " count:" . count($accIDInfo)); $accountIDArray = array(); $dateInsInfo = array(); foreach ($accIDInfo as $accID => $loginoutInfo) { // logweb(" accID:" . $accID. json_encode($loginoutInfo)); @@ -343,6 +375,11 @@ $ActiveYMD = substr($LogoffTime, 0, 10); } if ($accountIDArray[$AccountID]) { logweb("###今日日活账号已存在:AccountID:" . $$AccountID . " accID:" . $accID); continue; } $accountIDArray[$AccountID] = 1; array_push($dateInsInfo, array( "Channel" => $Channel, "AccountID" => $AccountID,