AddInfo( $strKey, $strPackTypes ); } return $info; } function SendToDBServer($strOrderID) { $strDataServerIP=''; if( !\CommFunc\GetKeyFromConfig( 'config.ini', 'Server', 'DataServerIP', $strDataServerIP, '{"ErrorNo":"5","ErrorStr":"Read dataserver ip error"}' ) ) { exit(); } $strDataServerPort=''; if( !\CommFunc\GetKeyFromConfig( 'config.ini', 'Server', 'DataServerPort', $strDataServerPort, '{"ErrorNo":"6","ErrorStr":"Read dataserver port error"}' ) ) { exit(); } //与DataServer进行交互,获得DataServer的返回值 $sock=new \Socket\Socket(); if( !$sock->Init() ) { echo '{"ErrorNo":"7","ErrorStr":"Socket init error"}'; exit(); } if( !$sock->Connect( $strDataServerIP, $strDataServerPort ) ) { echo '{"ErrorNo":"8","ErrorStr":"Connect data server error"}'; exit(); } $bufferSend=''; $bufferGmCmd=PackGMCommand( $strOrderID, 113, strlen($_POST['pack']), $_POST['pack'], 0, '' ); \Logging\LogDebug( \CommFunc\BinToStr($bufferGmCmd) ); #三个类型数字是由服务端给出的,需要变动也会由服务端给出改法, #意义大概是包类型是内部通讯封包,源是GM工具,目标是DATASERVER $bufferSend=\CommonOperate\PackData( $bufferGmCmd, 2, 1, 11 ); if( !$sock->Write( $bufferSend ) ) { echo '{"ErrorNo":"9","ErrorStr":"Send data to data server error"}'; exit(); } \Logging\LogInfo( '开始接收数据' ); $nSingleRecvMaxLen=1000; $strRecv=''; #开始循环接收 $type=0; $ResultLen=0; $Result=''; $UserDataLen=0; $UserData=''; while(TRUE) { //接收数据,进行判断成功与否,然后进行解析 \Logging\LogDebug( "socket开始接收数据" ); if( !$sock->Read( $strRead ) ) { echo '{"ErrorNo":"10","ErrorStr":"Recv data error"}'; exit(); } \Logging\LogDebug( "socket接收数据完毕" ); $strRecv=$strRecv.$strRead; $customBodyBuffer=''; if( \CommonOperate\UnPackData($strRecv, $customBodyBuffer) ) { #判断是不是GM工具的包类型114 if( \CommonOperate\GetPackType($customBodyBuffer)==114 ) { $strRecvOrderID=''; UnPackGMCommand( $customBodyBuffer, $type, $ResultLen, $Result, $UserDataLen, $UserData, $strRecvOrderID ); if( $strRecvOrderID==$strOrderID ) { //解析成功,则不再进行接收,并且接收的数据是给自己的 break; } else { \Logging\LogError( "接收的数据不是自己的!原strOderID是:$strOrderID,新的是:$strRecvOrderID" ); } } } } \Logging\LogInfo( '数据获得并解析完毕' ); //返回结果给请求者 echo $Result.$UserData; } \Logging\CreateLogging( 'GMTool' ); $strOrderID=\CommFunc\guid(); \Logging\LogAddObj(\Logging\strPhpDir, 'GMTool', "GUID:$strOrderID"); \Logging\LogInfo( '开始处理...' ); if( !\CommFunc\CheckPostParam("pack", '{"ErrorNo":"1","ErrorStr":"Param pack error"}') ) { exit(); } if( !\CommFunc\CheckPostParam("sign", '{"ErrorNo":"2","ErrorStr":"Param sign error"}') ) { exit(); } //验证信息是否是可允许的 $authorityInfo=LoadAuthorityData(); $arrayPack = json_decode( $_POST['pack'] , true ); \Logging\LogInfo( "json_decode的结果是".var_export( $arrayPack, True ) ); $arrayPack['pack_type']=iconv( 'utf-8' , 'gbk', $arrayPack['pack_type'] ); if( !array_key_exists( 'pack_type', $arrayPack ) ) { echo '{"ErrorNo":"3","ErrorStr":"Can\'t find pack_type in jsondata"}'; $strPackRecv=$_POST['pack']; \Logging\LogError( "收到的信息错误,收到的数据是:$strPackRecv" ); exit(); } $strKey=$authorityInfo->GetKeyFromValue( $arrayPack['pack_type'] ); if( md5( $_POST['pack'].$strKey )!=$_POST['sign'] ) { \CommFunc\LogErrorAndPrint( '{"ErrorNo":"4","ErrorStr":"Sign error, end"}' ); exit(); } $DBArray = array("GMTServer_Account", "GMTServer_Name"); if (in_array($arrayPack['pack_type'], $DBArray)) { //可以直接处理 #开始连接数据库 $dbOpt=new \MongoCommon\MongoDBOpt( '..\\InterfaceConfig.php', "ServerName" ); if( !$dbOpt->Init() ) { #echo '数据库初始化失败!原因:'.$dbOpt->GetLastError().'请检查配置'; $resultjson['status'] = -2; echo json_encode($resultjson); exit; } \Logging\LogInfo( 'gmtool连接数据库成功.' ); $skip=0; $perPage=20; #查找账号是否有账户可以使用 if($arrayPack['pack_type'] == "GMTServer_Account") { if($arrayPack["accID"] == "") { $findArray = array(); } else { $findArray=array('AccID'=>new MongoRegex($arrayPack["accID"].".*/i")); } $dbName = "tagDBPlayer"; } else if ($arrayPack['pack_type'] == "GMTServer_Name") { if($arrayPack["name"] == "") { $findArray = array(); } else { $findArray=array('PlayerName'=>new MongoRegex("/.*".$arrayPack["name"].".*/i")); } $dbName = "tagDBPlayer"; } if(isset($arrayPack["skip"])) { $skip=$arrayPack["skip"]; } if(isset($arrayPack["perPage"])) { $perPage=$arrayPack["perPage"]; } //新增排序 $sortinfo = array(); if(isset($arrayPack["sort"])) { $sortinfo = json_decode($arrayPack["sort"], true); } //查询玩家表 $retArray; $retColumn=json_decode($arrayPack["fields"]); $result = $dbOpt->GetData($dbName, $findArray, $retArray, $retColumn, $skip, $perPage, $sortinfo); //{"ResultType": 0, "ResultMsg": {"forbidTalk": false, "forbidLogin": false}, "pack_type": "GMT_GetPlayerForbid"} if($result) { echo json_encode(array("ResultType"=>0, "ResultMsg"=>$retArray, "pack_type"=>$arrayPack['pack_type'])); //\Logging\LogInfo( '数据库直接查询结果'.print_r($retArray, true) ); } else { echo json_encode(array("ResultType"=>102)); } } else { //发送给游戏服务器DB SendToDBServer($strOrderID); } \Logging\LogInfo( '结束处理..' );