cari
Rumahphp教程php手册用 PHP 监听 ZooKeeper

用 PHP 监听 ZooKeeper

Jun 06, 2016 pm 07:38 PM
ghttpsphpzookeeperkodpantau

代码出处: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
<?php
//
// 首先, 执行 zkCli.sh 进入 ZooKeeper 命令行工具界面,
// 在命令行中可以执行以下操作 :
//
// 新建 Kev/Value
// $ create /xgame 0
// $ create /xgame/S00 0
// $ create /xgame/S00/conf/maintenanceTimeStr 0
// $ create /xgame/S00/conf/whiteList 0
// $ create /xgame/S00/conf/blackList 0
//
// 之后执行 PHP 命令启动监听服务 :
//
// $ php ZkServ.php
//
// 注意 : 请事先确认是否已经安装 php-zookeeper 扩展?
// 回到 ZooKeeper 界面, 尝试修改维护时间字符串 :
//
// $ set /xgame/S00/conf/maintenanceTimeStr [20150101000000,20151231235959]
//
// @import
require_once("MyLog.php");
require_once("etc/AppName.php");
require_once("etc/ServerName.php");
require_once("etc/ZooKeeper.php");

/**
 * ZooKeeper 服务
 *
 * @auth jinhaijiang
 * @since 2015/6/28
 * @see https://git.oschina.net/afrxprojs/xgame-code_server
 *
 */
class ZkServ extends Zookeeper {
    /**
     * 应用名称
     *
     * @var String
     *
     */
    public $_appName;

    /**
     * 服务器名称
     *
     * @var String
     *
     */
    public $_serverName;

    /**
     * ZooKeeper 路径字典
     *
     * @var Array
     *
     */
    private $_zkPathMap;

    /**
     * 启动服务
     *
     */
    public function startUp() {
        // 获取应用名称和服务器名称
        $appName = $this->_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
<?php
\$GLOBALS["MAINTENANCE_START_TIME"] = $startTimeStr;
\$GLOBALS["MAINTENANCE_END_TIME"] = $endTimeStr;

__EOF;

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

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

        $text = <<< __EOF
<?php
\$GLOBALS["WHITE_LIST"] = array(
__EOF;

        foreach ($jsonArr as $json) {
            // 获取平台 UUId
            $platformUUId = $json;
            // 添加到文本
            $text .= "\n\t\"${platformUUId}\" => 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
<?php
\$GLOBALS["BLACK_LIST"] = array(
__EOF;

        foreach ($jsonArr as $json) {
            // 获取平台 UUId
            $platformUUId = $json;
            // 添加到文本
            $text .= "\n\t\"${platformUUId}\" => 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);
}
Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

PhpStorm versi Mac

PhpStorm versi Mac

Alat pembangunan bersepadu PHP profesional terkini (2018.2.1).

MantisBT

MantisBT

Mantis ialah alat pengesan kecacatan berasaskan web yang mudah digunakan yang direka untuk membantu dalam pengesanan kecacatan produk. Ia memerlukan PHP, MySQL dan pelayan web. Lihat perkhidmatan demo dan pengehosan kami.

Versi Mac WebStorm

Versi Mac WebStorm

Alat pembangunan JavaScript yang berguna

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

MinGW - GNU Minimalis untuk Windows

MinGW - GNU Minimalis untuk Windows

Projek ini dalam proses untuk dipindahkan ke osdn.net/projects/mingw, anda boleh terus mengikuti kami di sana. MinGW: Port Windows asli bagi GNU Compiler Collection (GCC), perpustakaan import yang boleh diedarkan secara bebas dan fail pengepala untuk membina aplikasi Windows asli termasuk sambungan kepada masa jalan MSVC untuk menyokong fungsi C99. Semua perisian MinGW boleh dijalankan pada platform Windows 64-bit.