public final function discovery(array $config)
{
$self = $this;
$this->_server->addProcess(new \swoole_process(function () use($config, $self) {
swoole_set_process_name("dora: monitor service");
static $_redisObj = array();
while (true) {
//for result list
$serverListResult = array();
//get redis config
$redisConfig = $self->_config["redis"];
//connect all redis
foreach ($redisConfig as $redisItem) {
//validate redis ip and port
if (trim($redisItem["ip"]) && $redisItem["port"] > 0) {
$key = $redisItem["ip"] . "_" . $redisItem["port"];
try {
//connecte redis
if (!isset($_redisObj[$key])) {
//if not connect
$_redisObj[$key] = new \Redis();
$_redisObj[$key]->connect($redisItem["ip"], $redisItem["port"]);
}
//get register node server
$serverList = $_redisObj[$key]->smembers("dora.serverlist");
if ($serverList) {
foreach ($serverList as $sitem) {
$info = json_decode($sitem, true);
//decode success
if ($info) {
//get last report time
$lastTimeKey = "dora.servertime." . $info["node"]["ip"] . "." . $info["node"]["port"] . ".time";
$lastUpdatTime = $_redisObj[$key]->get($lastTimeKey);
//timeout ignore
if (time() - $lastUpdatTime > 20) {
continue;
}
if (is_array($info["group"])) {
foreach ($info["group"] as $groupname) {
$clientkey = $info["node"]["ip"] . "_" . $info["node"]["port"];
$serverListResult[$groupname][$clientkey] = array("ip" => $info["node"]["ip"], "port" => $info["node"]["port"]);
$serverListResult[$groupname][$clientkey]["updatetime"] = $lastUpdatTime;
}
}
//foreach group and record this info
}
//decode info if
}
// foreach
}
//if got server list from redis
} catch (\Exception $ex) {
//var_dump($ex);
$_redisObj[$key] = null;
echo "get redis server error" . PHP_EOL;
}
}
}
if (count($serverListResult) > 0) {
$configString = var_export($serverListResult, true);
$ret = file_put_contents($this->_config["export_path"], "<?php" . PHP_EOL . "//This is generaled by client monitor" . PHP_EOL . "return " . $configString . ";");
if (!$ret) {
echo "Error save the config to file..." . PHP_EOL;
} else {
echo "General config file to:" . $this->_config["export_path"] . PHP_EOL;
}
} else {
echo "Error there is no Config get..." . PHP_EOL;
}
//sleep 10 sec
sleep(10);
}
}));
}