16 卡牌服务端(自动开服相关;增加是否允许加入跨服标记,默认否;优化ServersConfig.json配置,支持后台导出,优化战斗服务器配置;服务器信息增加 GroupName、MapID、服务器类型、是否可跨服;)
8个文件已修改
3个文件已添加
376 ■■■■ 已修改文件
Common/CommFunc.php 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Common/ServerOPS.php 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Common/test/ServersConfig.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
InterfaceConfig.php 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Server/config.ini 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
index.php 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
serverops/refreshServersConfig.php 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
serverops/serverEdit.php 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
serverops/serverlist.php 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
serverops/setCanCross.php 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
task/minuteLoop.php 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Common/CommFunc.php
@@ -1550,4 +1550,42 @@
    }
    $signKey .= $callbackkey;
    return md5($signKey);
}
}
function GetBaseUrl()
{
    $pageURL = 'http';
    if ($_SERVER["HTTPS"] == "on") {
        $pageURL .= "s";
    }
    $pageURL .= "://";
    if ($_SERVER["SERVER_PORT"] != "80") {
        $pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"];
    } else {
        $pageURL .= $_SERVER["SERVER_NAME"];
    }
    // . $_SERVER["REQUEST_URI"]
    return $pageURL;
}
/**
 * 写入文件,如果目录不存在则自动创建
 *
 * @param string $filepath 文件路径
 * @param mixed $data 要写入的数据
 * @param int $flags 可选 flags (同 file_put_contents)
 * @return int|false 写入的字节数,失败返回 false
 */
function file_put_contents_mkdir($filepath, $data, $flags = 0)
{
    $dir = dirname($filepath);          // 获取文件所在目录
    if (!is_dir($dir)) {
        // 递归创建目录,权限可自行调整 (例如 0755)
        if (!mkdir($dir, 0755, true)) {
            // 目录创建失败,可记录日志或触发错误
            trigger_error("无法创建目录: {$dir}", E_USER_WARNING);
            return false;
        }
    }
    return file_put_contents($filepath, $data, $flags);
}
Common/ServerOPS.php
@@ -8,6 +8,24 @@
include_once "/Account/User.php";
include_once "/Account/userlogcomm.php";
/**服务器类型 */
class ServerType
{
    // 0主服,1子服,2跨服,3战斗服,4跨服中心
    const MainServer = 0;
    const ClientServer = 1;
    const CrossServer = 2;
    // const BattleServer = 3;
    const CrossCenter = 4;
    static $ServerTypeName = array(
        ServerType::MainServer => "主服",
        ServerType::ClientServer => "子服",
        ServerType::CrossServer => "跨服",
        // ServerType::BattleServer => "战斗服",
        ServerType::CrossCenter => "跨服中心",
    );
}
/**服务器开放状态 */
class ServerStatue
{
@@ -283,6 +301,39 @@
    return $refreshJsonFileArray;
}
/**
 * 刷新ServersConfig.json
 */
function RefreshServersConfigJson($Channel)
{
    if (!\CommFunc\GetConfig("ServerInfo", "PlayerCenterRoot", $PlayerCenterRoot)) {
        return array(false, "");
    }
    $saveJsonFile = $PlayerCenterRoot . "/Common/" . $Channel . "/ServersConfig.json";
    \DBOper\Find("GameServers", array("Channel" => $Channel), $serverList);
    \Logging\LogInfo("find db server count:" . count($serverList) . " Channel:" . $Channel);
    #{serverID:[groupName,serverMapID, serverType], ...}
    $saveArray = array();
    foreach ($serverList as $serverInfo) {
        $serverID = $serverInfo["ServerID"];
        $groupName = $serverInfo["GroupName"];
        $serverMapID = $serverInfo["ServerMapID"];
        $serverType = $serverInfo["ServerType"];
        if (!$groupName || !$serverMapID) {
            return array(false, "存在服务器ID未设置GroupName或地图: serverID=" . $serverID);
        }
        $saveArray["" . $serverID] = array($groupName, $serverMapID, $serverType);
    }
    ksort($saveArray);
    if (!\CommFunc\file_put_contents_mkdir($saveJsonFile, json_encode($saveArray))) {
        return array(false, "刷新导出失败");
    }
    \Logging\LogInfo("RefreshServersConfigJson Channel:" . $Channel . " saveJsonFile:" . $saveJsonFile);
    return array(true, $saveJsonFile);
}
function GetServerGroup($Channel)
{
    if (!\CommFunc\GetConfig("ServerInfo", "PlayerCenterRoot", $PlayerCenterRoot)) {
Common/test/ServersConfig.json
New file
@@ -0,0 +1 @@
{"86":["severname",10010,0],"87":["severname",10020,0],"187":["severname",10030,0],"10000":["cxkf",10010,4],"10001":["cxkf",10010,2],"10002":["cxkf",10030,2]}
InterfaceConfig.php
@@ -58,6 +58,10 @@
;自动开服限制时间范围列表,24小时制 [["从x时:分", "到x时:分"], ...]
AutoOpenServerLimitTimeRange = '[["23:30", "00:20"],  ["01:00", "06:00"]]'
;提前清档时间,单位分钟,【注】0点~0点x分时间开服的,统一0点清档,不然可能导致清档后0点又过天的问题;x=提前清档时间
AheadClearDataTime = 15
;根据创角人数自动开服的满足条件后多久自动开服,单位分钟,需大于提前清档时间
AutoOpenServerTimeByCreateRole  = 20
;媒体卡类型对应分组,目前用于越南版本运营公会分组 {"卡类型":"显示分组名", ...}
CoupontypeGroup = '{"g001":"公会1", "g002":"公会2"}'
Server/config.ini
@@ -3,19 +3,19 @@
DataServerPort=16901
[Popedom]
;权限数
;权限数
Popedom_count=2
;权限1
;key:此权限的key
;packtype:此权限包含的封包类型,以逗号分隔,如0101,0102
;注意:每个权限中的pack_types不能有重复的,如Popedom_1中的pack_types不能在Popedom_2中的pack_types
;权限1
;key:此权限的key
;packtype:此权限包含的封包类型,以逗号分隔,如0101,0102
;注意:每个权限中的pack_types不能有重复的,如Popedom_1中的pack_types不能在Popedom_2中的pack_types
[Popedom_1]
key=U1d4dmNrbFdQVDE9
pack_types=GMT_AllDoubleBill,GMT_QDFLDoubleBill,GMT_GetCoinReq,GMT_ForbidLogin,GMT_UnForbidLogin,GMT_ForbidTalk,GMT_PlayerItemInfo,GMT_GetPlayerInfo,GMT_UnForbidTalk,GMT_GetFamilyInfo,GMT_GetPlayerForbid,GMT_BroadCast,GMT_KickPlayer,GMT_LockIP,GMT_UnLockIP,GMT_GetForbidInfo,GMT_FamilyDismiss,GMT_FamilyTransfer,GMT_MagicWeaponExp,GMT_QueryBillboard,GMT_QueryBillboardCross,GMT_ReloadConfig,GMT_QueryRoles,GMT_ClearTalkCache
;权限2
;权限2
[Popedom_2]
key=VERCbmNrbFZQVDE9
pack_types=GMT_ItemExpiation,GMT_MoneyExpiation,GMT_AddNewGuyCard,GMT_CardTypeInfo,GMT_NewGuyCardInfo,GMT_CTG,GMT_FreshmanGuide,GMT_BourseOnOff,GMT_AddEntireCompensation,GMT_AddPersonalCompensation,GMT_SetOpenServerTime,GMT_CompensationQuery,GMT_CompensationMgr,GMT_MediaCard,GMT_CrossServerMaintain,GMT_CrossClientServerMaintain,GMT_AddAuctionItem,GMT_AddTitle,GMT_CompensationQueryPersonal,GMT_CrossActServerIDChange,GMT_DelPlayerMoney,GMT_DelPlayerItem,GMT_RefixWorldLV,GMT_Execfile,GMT_SetGMLevel,GMT_CrossBattleChampionSet,GMT_AddPayCoin,GMT_ReloadPymongo,GMT_Worship,GMT_Face,GMT_CheckOpenServer,GMT_ClearBag
pack_types=GMT_ItemExpiation,GMT_MoneyExpiation,GMT_AddNewGuyCard,GMT_CardTypeInfo,GMT_NewGuyCardInfo,GMT_CTG,GMT_FreshmanGuide,GMT_BourseOnOff,GMT_AddEntireCompensation,GMT_AddPersonalCompensation,GMT_SetOpenServerTime,GMT_CompensationQuery,GMT_CompensationMgr,GMT_MediaCard,GMT_CrossServerMaintain,GMT_CrossClientServerMaintain,GMT_AddAuctionItem,GMT_AddTitle,GMT_CompensationQueryPersonal,GMT_CrossActServerIDChange,GMT_DelPlayerMoney,GMT_DelPlayerItem,GMT_RefixWorldLV,GMT_Execfile,GMT_SetGMLevel,GMT_CrossBattleChampionSet,GMT_AddPayCoin,GMT_ReloadPymongo,GMT_Worship,GMT_Face,GMT_CheckOpenServer,GMT_SetCanCross,GMT_ClearBag
index.php
@@ -82,7 +82,7 @@
        array(\User\Permission::P_QueryBillboard, "GMToolClient/queryBillboard.php", \Lang\gettext("查询实时排行榜")),
        array(\User\Permission::P_QueryBillboardCross, "serverinfo/billboardhiscross.php", \Lang\gettext("查询跨服历史榜")),
        array(\User\Permission::P_QueryBillboardCross, "GMToolClient/queryBillboardCross.php", \Lang\gettext("查询跨服排行榜")),
        array(\User\Permission::P_MagicWeaponExp, "GMToolClient/magicWeaponExp.php", \Lang\gettext("法宝灵魂")),
        // array(\User\Permission::P_MagicWeaponExp, "GMToolClient/magicWeaponExp.php", \Lang\gettext("法宝灵魂")),
    ),
    \Lang\gettext("高级命令") => array(
@@ -97,14 +97,14 @@
        array(\User\Permission::P_DelPlayerItem, "SuperGMToolClient/DelPlayerItem.php", \Lang\gettext("扣除玩家物品")),
        array(\User\Permission::P_Face, "SuperGMToolClient/Face.php", \Lang\gettext("头像管理")),
        array(\User\Permission::P_AddTitle, "SuperGMToolClient/AddTitle.php", \Lang\gettext("称号管理")),
        array(\User\Permission::P_Worship, "SuperGMToolClient/Worship.php", \Lang\gettext("膜拜管理")),
        // array(\User\Permission::P_Worship, "SuperGMToolClient/Worship.php", \Lang\gettext("膜拜管理")),
        array(\User\Permission::P_SetGMLevel, "SuperGMToolClient/SetGMLevel.php", \Lang\gettext("设置玩家GM")),
        array(\User\Permission::P_AddAuctionItem, "SuperGMToolClient/AddAuctionItem.php", \Lang\gettext("上架拍品")),
        array(\User\Permission::P_RefixWorldLV, "SuperGMToolClient/RefixWorldLV.php", \Lang\gettext("纠正世界等级")),
        // array(\User\Permission::P_AddAuctionItem, "SuperGMToolClient/AddAuctionItem.php", \Lang\gettext("上架拍品")),
        // array(\User\Permission::P_RefixWorldLV, "SuperGMToolClient/RefixWorldLV.php", \Lang\gettext("纠正世界等级")),
        // array(\User\Permission::GMT_FreshmanGuide, "SuperGMToolClient/freshmanGuide.html", \Lang\gettext("新手指导员")),
        array(\User\Permission::P_BourseOnOff, "SuperGMToolClient/BourseOnOff.php", \Lang\gettext("交易所开关")),
        array(\User\Permission::P_CrossActServerIDChange, "SuperGMToolClient/CrossActServerIDChange.php", \Lang\gettext("跨服活动区服ID修改")),
        array(\User\Permission::P_CrossBattleChampionSet, "SuperGMToolClient/CrossBattleChampionSet.php", \Lang\gettext("跨服战场冠军赛")),
        // array(\User\Permission::P_BourseOnOff, "SuperGMToolClient/BourseOnOff.php", \Lang\gettext("交易所开关")),
        // array(\User\Permission::P_CrossActServerIDChange, "SuperGMToolClient/CrossActServerIDChange.php", \Lang\gettext("跨服活动区服ID修改")),
        // array(\User\Permission::P_CrossBattleChampionSet, "SuperGMToolClient/CrossBattleChampionSet.php", \Lang\gettext("跨服战场冠军赛")),
        array(\User\Permission::P_Execfile, "SuperGMToolClient/Execfile.php", \Lang\gettext("执行命令")),
    ),
serverops/refreshServersConfig.php
New file
@@ -0,0 +1,44 @@
<?php
include_once "/Common/Logging.php";
include_once "/Account/User.php";
include_once "/Common/ServerOPS.php";
include_once "/Common/CommFunc.php";
include_once "/language/lang.php";
\Logging\CreateLogging("serverops.refreshServersConfig.php");
$Permission = \User\Permission::P_OPSRefreshServer;
$channel = $_SESSION['spid'];
$user = new \User\User($_SESSION['UserAccount']);
if (!$user->HavePermission($Permission)) {
    exit;
}
$ret = \ServerOPS\RefreshServersConfigJson($channel);
$isOK = $ret[0];
$msg = $ret[1];
?>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title><?php echo \Lang\gettext("刷新ServersConfigJson"); ?></title>
</head>
<body>
    <center>
        <p><b><?php echo \Lang\gettext("刷新ServersConfigJson"); ?></b></P>
    </center>
    <?php
    if ($isOK) {
        echo \Lang\gettext("刷新成功!导出文件"), ":<br/><br/>";
    } else {
        echo \Lang\gettext("刷新失败"), "<br/><br/>";
    }
    echo $msg . "<br/>";
    ?>
</body>
</html>
serverops/serverEdit.php
@@ -204,6 +204,53 @@
                </td>
            </tr>
            <tr>
                <td class="formTableTDName">GroupName: </td>
                <td class="formTableTDValue">
                    <input type="text" name="GroupName" id="GroupName" value="<?php echo array_key_exists("GroupName", $editInfo)  ? $editInfo["GroupName"] : "severname" ?>" />
                </td>
            </tr>
            <tr>
                <td class="formTableTDName">所在地图ID: </td>
                <td class="formTableTDValue">
                    <input type="number" name="ServerMapID" id="ServerMapID" value="<?php echo array_key_exists("ServerMapID", $editInfo)  ? $editInfo["ServerMapID"] : 10010 ?>" />
                </td>
            </tr>
            <tr>
                <td class="formTableTDName">服务器类型: </td>
                <td class="formTableTDValue">
                    <select name="ServerType" id="ServerType">
                        <?php
                        $selected = array_key_exists("ServerType", $editInfo)  ? $editInfo["ServerType"] : \ServerOPS\ServerType::MainServer;
                        foreach (\ServerOPS\ServerType::$ServerTypeName as $key => $value) {
                            echo "<option value='" . $key . "'";
                            if ($key == $selected) {
                                echo " selected";
                            }
                            echo ">" . $value . "</option>";
                        }
                        ?>
                    </select>
                </td>
            </tr>
            <tr>
                <td class="formTableTDName">是否可跨服: </td>
                <td class="formTableTDValue">
                    <select name="CanCross" id="CanCross" onchange="OnSelectCanCross(this.value)">
                        <?php
                        $selected = array_key_exists("CanCross", $editInfo)  ? $editInfo["CanCross"] : 0;
                        foreach (array("不允许", "允许", "查询") as $key => $value) {
                            echo "<option value='" . $key . "'";
                            if ($key == $selected) {
                                echo " selected";
                            }
                            echo ">" . $value . "</option>";
                        }
                        ?>
                    </select>
                    <div id="CanCrossTips" />
                </td>
            </tr>
            <tr>
                <td class="formTableTDName">所属主服: </td>
                <td class="formTableTDValue">
                    <input type="number" name="MainServerID" id="MainServerID" value="<?php echo array_key_exists("MainServerID", $editInfo)  ? $editInfo["MainServerID"] : "" ?>" size="50" placeholder="选填,设置合服所属主服" />
@@ -268,6 +315,46 @@
            );
        }
        function OnSelectCanCross(state) {
            var tips = document.getElementById("CanCrossTips");
            var ServerType = document.getElementById("ServerType").value;
            if (ServerType != 0) {
                tips.innerHTML = "非主服不需要处理跨服状态";
                return
            }
            var channel = '<?php echo $channel ?>';
            var serverID = '<?php echo $ServerID ?>';
            if (serverID == 0) {
                document.getElementById("CanCross").value = 0;
                tips.innerHTML = "新建服务器只能默认不可跨服";
                return
            }
            tips.innerHTML = "请求中...";
            tips.errTips = 1;
            ajaxRequest("setCanCross.php?channel=" + channel + "&serverID=" + serverID + "&setValue=" + state,
                function(xmlhttp) {
                    var br = getbr();
                    var res = JSON.parse(xmlhttp.responseText);
                    var errMsg = res.errMsg;
                    var canCross = res.canCross;
                    tips.innerHTML = "";
                    var errTips = "请求失败";
                    if (errMsg == "OK") {
                        errTips = canCross == 1 ? "允许" : "不允许";
                        document.getElementById("CanCross").value = canCross;
                    }
                    if (errMsg != "OK") {
                        tips.insertAdjacentHTML("beforeEnd", "<font color='red'>" + errTips + "</font>");
                        tips.errTips = 1;
                    } else {
                        tips.insertAdjacentHTML("beforeEnd", "请求成功:" + errTips);
                        tips.errTips = 0;
                    }
                },
            );
        }
        function CheckSubmit() {
            if (!document.getElementById("ServerID").value || document.getElementById("ServerID").value <= 0) {
                alert("请输入大于0服务器ID!");
@@ -311,6 +398,12 @@
                    return false;
                }
            }
            var canCrossTips = document.getElementById("CanCrossTips");
            if (canCrossTips.errTips == 1) {
                alert("设置是否允许跨服异常,无法提交!");
                document.getElementById('CanCrossTips').focus();
                return false;
            }
            return true;
        }
    </script>
serverops/serverlist.php
@@ -34,6 +34,10 @@
    $LoginPort = intval($_POST["LoginPort"]);
    $GamePort = intval($_POST["GamePort"]);
    $MainServerID = intval($_POST["MainServerID"]);
    $GroupName = $_POST["GroupName"];
    $ServerMapID = intval($_POST["ServerMapID"]);
    $ServerType = intval($_POST["ServerType"]);
    $CanCross = intval($_POST["CanCross"]);
    $find = array(
        "Channel" => $channel,
@@ -67,6 +71,10 @@
        "LoginPort" => $LoginPort,
        "GamePort" => $GamePort,
        "MainServerID" => $MainServerID,
        "GroupName" => $GroupName,
        "ServerMapID" => $ServerMapID,
        "ServerType" => $ServerType,
        "CanCross" => $CanCross,
    );
    // 添加
@@ -293,17 +301,21 @@
//显示表格字段配置 key-参数名,value-说明
$tableArray = array(
    "ServerID" => array("区服", "5%", "center"),
    "ServerName" => array("名称", "10%", "center"),
    "JsonBranch" => array("导出Json分支文件", "14%", "center"),
    "ServerID" => array("区服", "4%", "center"),
    "ServerName" => array("名称", "6%", "center"),
    "JsonBranch" => array("分支", "3%", "center"),
    "StartDate" => array("开服时间", "11%", "center"),
    "ClearState" => array("清档状态", "5%", "center"),
    "Statue" => array("开放状态", "5%", "center"),
    "RunningStatus" => array("运行状态", "5%", "center"),
    "Recommend" => array("推荐", "3%", "center"),
    "RegionDomain" => array("域名", "19%", "center"),
    "RegionDomain" => array("域名", "16%", "center"),
    "LoginPort" => array("登录端口", "5%", "center"),
    "GamePort" => array("游戏端口", "5%", "center"),
    "GroupName" => array("物理机组", "6%", "GroupName"),
    "ServerMapID" => array("地图", "4%", "ServerMapID"),
    "ServerType" => array("类型", "5%", "ServerType"),
    "CanCross" => array("可跨服", "4%", "CanCross"),
    "MainServerID" => array("所属主服", "5%", "center"),
    "" => array("操作", ""),
);
@@ -371,6 +383,7 @@
        <input type="button" value="新建服务器" onclick="window.location.href='serverEdit.php?opType=add'" />
        <input type="button" value="区服分组" onclick="window.location.href='serverGroup.php'" />
        <input type="button" value="刷新选服列表" onclick="window.location.href='refreshServerJson.php'" />
        <input type="button" value="刷新ServersConfig.json" onclick="window.location.href='refreshServersConfig.php'" />
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        </select>
@@ -457,8 +470,12 @@
                        }
                    } else if ($key == "Recommend") {
                        $tdContent = $tdContent == 1 ? "是" : "否";
                    } else if ($key == "CanCross") {
                        $tdContent = $tdContent == 1 ? "是" : "否";
                    } else if ($key == "ServerType") {
                        $tdContent = \ServerOPS\ServerType::$ServerTypeName[$tdContent];
                    } elseif ($key == "JsonBranch") {
                        $tdContent = \ServerOPS\GetCommonServerlistJsonFileName($channel, $tdContent);
                        #$tdContent = \ServerOPS\GetCommonServerlistJsonFileName($channel, $tdContent);
                    } elseif ($key == "StartDate") {
                        $OpenServerWay = $serverInfo["OpenServerWay"];
                        $RelationServerID = $serverInfo["RelationServerID"];
serverops/setCanCross.php
New file
@@ -0,0 +1,25 @@
<?php
include_once "/Common/Logging.php";
include_once "/Common/CommFunc.php";
$channel = $_GET["channel"];
$serverID = intval($_GET["serverID"]);
$setValue = $_GET["setValue"];
\Logging\CreateLogging("serverops.setCanCross.php");
\Logging\LogInfo("_GET:" . print_r($_GET, true));
// 设置可否允许加入跨服
$packData = array("setValue" => $setValue);
$retList = \CommFunc\SendGMTToGameServers(True, "GMT_SetCanCross", $packData, $channel, array($serverID));
\Logging\LogInfo("retList:" . print_r($retList, true));
if (!is_array($retList)) {
    echo "{}";
    exit;
}
$ret = json_decode($retList[$serverID], true);
if (!$ret || !array_key_exists("ResultType", $ret)) {
    echo "{}";
    exit;
}
echo json_encode($ret["ResultMsg"]);
task/minuteLoop.php
@@ -64,20 +64,31 @@
function OnMinute($minuteStr)
{
    \Logging\LogInfo("Todo OnMinute: " . $minuteStr);
    checkAutoOpenServer();
    checkAutoOpenServer_ByCreateRole();
    checkPreOpenServer();
    checkOpenServerTime();
    checkOpenServer_ClearData(); // 同步清档
}
//==========================================================================================================
/**
 * 检查自动服务器信息,每分钟处理一次
 * 自动开服流程
 * 1. 设置预开服方式(设置开放服务器入口时间)
 *      1.1 直接设置开服时间(开放入口时间)
 *      1.2 设置根据某个服务器创角人数满足x人后开服,满足条件后会根据配置 AutoOpenServerTimeByCreateRole 设置开服时间,同 1.1 的开服时间
 *
 * 2. 根据最终的开服时间/开放入口时间同步游戏服提前清档 - 游戏服的实际开服时间
 *
 * 3. 根据预开服时间及清档状态验证满足后开放入口,同时会验证游戏服相关状态是否满足 checkOpenServer (游戏版本、开服天等)
 *
 */
function checkAutoOpenServer()
/**
 * 检查自动服务器信息,每分钟处理一次,根据关联的服务器创角人数满足条件后自动设置预开服时间
 */
function checkAutoOpenServer_ByCreateRole()
{
    $curDate = getdate();
    $dateStr = $curDate['year'] . "-" . $curDate['mon'] . "-" . $curDate['mday'];
    \Logging\LogInfo("=== Do checkAutoOpenServer ===");
    \Logging\LogInfo("=== Do checkAutoOpenServer_ByCreateRole ===");
    // 设定时间范围 如21-24点 不会自动开服
    CommFunc\GetConfig("ServerInfo", "AutoOpenServerLimitTimeRange", $AutoOpenServerLimitTimeRange);
    $limitTimeList = json_decode($AutoOpenServerLimitTimeRange);
@@ -110,7 +121,8 @@
    }
    // 达到条件后多少分钟后入口开放,分钟,需要预留清档缓冲时间,需大于提前清档时间,目前是提前15分钟清档
    $setStartDate = \CommFunc\TimeToStrDateTime(strtotime("+20 minutes"));
    CommFunc\GetConfig("ServerInfo", "AutoOpenServerTimeByCreateRole", $AutoOpenServerTimeByCreateRole);
    $setStartDate = \CommFunc\TimeToStrDateTime(strtotime("+" . $AutoOpenServerTimeByCreateRole . " minutes"));
    \Logging\LogInfo("setStartDate." . $setStartDate);
    $serverCreateRoleInfo = array();
@@ -179,7 +191,7 @@
        return;
    }
    $x7notifyserverInfo = array();
    // $x7notifyserverInfo = array();
    $refrshJsonBranchArray = array();
    $curTime = strtotime(date("Y-m-d H:i:s", time()));
@@ -209,7 +221,8 @@
        }
        // 进一步检查最新服务器开服状态是否正常
        $checkUrl = "http://127.0.0.1/serverops/checkOpenServer.php";
        $baseUrl = CommFunc\GetBaseUrl();
        $checkUrl = $baseUrl . "/serverops/checkOpenServer.php";
        $retStr = \CommFunc\DoGet($checkUrl, array("channel" => $Channel, "serverID" => $ServerID));
        $checkRet = json_decode($retStr, true);
        if (!isset($checkRet) || !array_key_exists("errMsg", $checkRet) || $checkRet["errMsg"] != "OK") {
@@ -223,6 +236,7 @@
            "RunningStatus" => \ServerOPS\ServerRunningStatus::Light,
            "Statue" => \ServerOPS\ServerStatue::Open,
            "Recommend" => 1, // 新开放入口服默认推荐
            "CanCross" => 1, // 自动开服的开放入口默认设置为可跨服,游戏服在自动开服清档时也是默认设置为可跨服
        );
        if (\DBOper\Update("GameServers", $find, $set)) {
            \Logging\LogInfo("set server open ok." . print_r($serverInfo, true));
@@ -231,8 +245,8 @@
                "Channel" => $Channel,
                "ServerID" => array('$nin' => array($ServerID))
            ), array("Recommend" => 0), false, false, true);
            // 通知sp服务器开放
            \CommFunc\DoPost("http://127.0.0.1/serverops/hy/report_server.php", array("channel" => $Channel, "server_id" => $ServerID));
            // 【通知sp服务器开放】
            // \CommFunc\DoPost("http://127.0.0.1/serverops/hy/report_server.php", array("channel" => $Channel, "server_id" => $ServerID));
        } else {
            \Logging\LogError("set server open error." . print_r($serverInfo, true));
        }
@@ -242,14 +256,14 @@
            array_push($refrshJsonBranchArray, $refreshBranch);
        }
        if (\CommFunc\GetConfig("x7", "JsonBranch_" . $Channel, $branch) && $branch == $JsonBranch) {
            if (!array_key_exists($Channel, $x7notifyserverInfo)) {
                $x7notifyserverInfo[$Channel] = array();
            }
            $x7notifyserverList = $x7notifyserverInfo[$Channel];
            array_push($x7notifyserverList, $serverInfo);
            $x7notifyserverInfo[$Channel] = $x7notifyserverList;
        }
        // if (\CommFunc\GetConfig("x7", "JsonBranch_" . $Channel, $branch) && $branch == $JsonBranch) {
        //     if (!array_key_exists($Channel, $x7notifyserverInfo)) {
        //         $x7notifyserverInfo[$Channel] = array();
        //     }
        //     $x7notifyserverList = $x7notifyserverInfo[$Channel];
        //     array_push($x7notifyserverList, $serverInfo);
        //     $x7notifyserverInfo[$Channel] = $x7notifyserverList;
        // }
    }
    \Logging\LogInfo("refrshJsonBranchArray." . print_r($refrshJsonBranchArray, true));
@@ -257,9 +271,9 @@
        \ServerOPS\RefreshCommonServerlistJson($refreshBranch["Channel"], $refreshBranch["JsonBranch"], "System");
    }
    foreach ($x7notifyserverInfo as $Channel => $x7notifyserverList) {
        x7_common_serverNotify($Channel, $x7notifyserverList);
    }
    // foreach ($x7notifyserverInfo as $Channel => $x7notifyserverList) {
    //     x7_common_serverNotify($Channel, $x7notifyserverList);
    // }
}
function x7_common_serverNotify($appid, $notifyserverList)
@@ -303,9 +317,9 @@
    send_common_to_x7($serverNotifyUrl, $bizParams, $appkey, $prikey, $pubkey, $apiMethod);
}
function checkOpenServerTime()
function checkOpenServer_ClearData()
{
    \Logging\LogInfo("=== Do checkOpenServerTime ===");
    \Logging\LogInfo("=== Do checkOpenServer_ClearData ===");
    // 找出所有未清档服务器
    \DBOper\Find("GameServers", array("ClearState" => 0), $serverList);
@@ -313,7 +327,8 @@
        return;
    }
    $aheadClearMin = 15; // 提前清档时间,分钟,0点~0点x分钟,统一0点清档,不然可能导致清档后0点又过天的问题;x=提前清档时间
    // 提前清档时间,分钟,0点~0点x分钟,统一0点清档,不然可能导致清档后0点又过天的问题;x=提前清档时间
    CommFunc\GetConfig("ServerInfo", "AheadClearDataTime", $aheadClearMin);
    $aheadSyncMin = 15; // 相对清档时间提前同步设置清档时间,分钟
    $curTime = strtotime(date("Y-m-d H:i:s", time()));