代码出处:https://git.oschina.net/afrxprojs/xgame-code_server ZooKeeper ?php//// 首先, 执行 zkCli.sh 进入 ZooKeeper 命令行工具界面,// 在命令行中可以执行以下操作 ://// 新建 Kev/Value// $ create /xgame 0// $ create /xgame/S00 0// $ create /xg

代码出处:https://git.oschina.net/afrxprojs/xgame-code_server ZooKeeper
_appName;
        $serverName = $this->_serverName;

        // 初始化路径字典
        $this->_zkPathMap = array(
            "/${appName}/${serverName}/conf/maintenanceTimeStr" => "updateMaintenanceTime",
            "/${appName}/${serverName}/conf/whiteList" => "updateWhiteList",
            "/${appName}/${serverName}/conf/blackList" => "updateBlackList",
        );

        foreach ($this->_zkPathMap as $key => $val) {
            // 输出调试日志
            MyLog::LOG()->debug("准备监听 : $key");
            // 设置监听
            $this->get($key, array($this, "watch"));
        }
    }

    /**
     * 监听数据变化
     *
     * @param $eventType
     * @param $eventState
     * @param $eventKey
     *
     */
    public function watch($eventType, $eventState, $eventKey) {
        // 记录日志信息
        MyLog::LOG()->info("接到数据");
        // 输出调试信息
        MyLog::LOG()->debug("eventType = ${eventType}, eventState = ${eventState}, eventKey = ${eventKey}");

        // 获取数据
        $data = $this->get($eventKey);
        // 获取函数引用并调用
        $funcRef = $this->_zkPathMap[$eventKey];
        $this->$funcRef($data);

        // 循环监听
        $this->get($eventKey, array($this, "watch"));
    }

    /**
     * 更新停服维护时间,
     * 注意这是一个回调函数! 会在 watch 函数中被间接调用
     *
     * @param String $value
     * @return void
     *
     */
    private function updateMaintenanceTime($value) {
        // 记录日志信息
        MyLog::LOG()->info("维护时间 = $value");
        // 获取 JSON 数组
        $jsonArr = json_decode($value);

        $startTimeStr = $jsonArr[0];
        $endTimeStr = $jsonArr[1];

        $text = <<< __EOF
info("白名单 = ${value}");
        // 获取 JSON 数组
        $jsonArr = json_decode($value);

        $text = <<< __EOF
 1, ";
        }

        $text .= "\n);";

        // 目标文件
        $targetFile = dirname(__FILE__) . "/etc/WhiteList.php";
        // 写出目标文件
        self::writeToFile($targetFile, $text);
    }

    /**
     * 更新黑名单
     * 注意这是一个回调函数! 会在 watch 函数中被间接调用
     *
     * @param String $value
     * @return void
     *
     */
    private function updateBlackList($value) {
        // 记录日志信息
        MyLog::LOG()->info("白名单 = ${value}");
        // 获取 JSON 数组
        $jsonArr = json_decode($value);

        $text = <<< __EOF
 1, ";
        }

        $text .= "\n);";

        // 目标文件
        $targetFile = dirname(__FILE__) . "/etc/BlackList.php";
        // 写出目标文件
        self::writeToFile($targetFile, $text);
    }

    /**
     * 写出目标文件
     *
     * @param $targetFile 目标文件的完整路径
     * @param $text 文本内容
     * @return void
     *
     */
    private static function writeToFile($targetFile, $text) {
        // 打开文件
        $fp = fopen($targetFile, "w");

        if (!$fp) {
            // 如果打开文件失败,
            // 则直接退出!
            MyLog::LOG()->error("打开文件 ${targetFile} 失败!!");
            return;
        }

        // 写出文件内容
        $result = fwrite($fp, $text);

        if (!$result) {
            // 如果写出文件失败,
            // 则记录错误日志
            MyLog::LOG()->error(
                "写出文件 ${targetFile} 失败!!"
            );
        }

        fflush($fp);
        fclose($fp);
    }
}

// 获取服务器名称
$appName = $GLOBALS["APP_NAME"];
$serverName = $GLOBALS["SERVER_NAME"];

// ZooKeeper 配置
$zkHost = $GLOBALS["ZK_SERVER_HOST"];
$zkPort = $GLOBALS["ZK_SERVER_PORT"];

// 创建服务对象
$servObj = new ZkServ("${zkHost}:${zkPort}");
$servObj->_appName = $appName;
$servObj->_serverName = $serverName;
// 启动服务
$servObj->startUp();

while (true) {
    MyLog::LOG()->info("live");
    sleep(60);
}
登录后复制

09-19 04:10