/** * 获得最好的的迷你搜索节点 * 先找出build_file_count最大的节点 * 如果build_file_count相同,找出search_count最小的节点 * @return array */ public function getBestNode() { $nodes = $this->getValidNodeList(); if (count($nodes) > 0) { $sortNodes = MiniUtil::arraySort($nodes, "build_file_count", SORT_DESC); $sortNodes = MiniUtil::getFistArray($sortNodes, 1); $bestNode = $sortNodes[0]; $buildFileCount = $bestNode["build_file_count"]; $searchCount = $bestNode["search_count"]; foreach ($nodes as $node) { if ($node["build_file_count"] == $buildFileCount) { if ($node["search_count"] < $searchCount) { $bestNode = $node; } } } return $bestNode; } return null; }
/** * 获得有效文件下载服务器节点 * 找到min(downloaded_file_count) and status=1的记录分配 * @param string $signature 文件内容hash * @return array */ private function getDownloadNode($signature) { $version = MiniVersion::getInstance()->getBySignature($signature); if (!empty($version)) { $metaKey = "store_id"; $meta = MiniVersionMeta::getInstance()->getMeta($version["id"], $metaKey); if (!empty($meta)) { $value = $meta["meta_value"]; $ids = explode(",", $value); $nodes = $this->getNodeList(); $validNodes = array(); foreach ($nodes as $node) { //先找到当前文件存储的节点 $isValidNode = false; foreach ($ids as $validNodeId) { if ($validNodeId == $node["id"]) { $isValidNode = true; } } if (!$isValidNode) { continue; } //然后判断节点是否有效,并在有效的节点找到下载次数最小的节点 if ($node["status"] == 1) { array_push($validNodes, $node); } } //选出downloaded_file_count最小的个节点 $validNodes = MiniUtil::arraySort($validNodes, "downloaded_file_count", SORT_ASC); $nodes = MiniUtil::getFistArray($validNodes, 1); if (count($nodes) > 0) { $node = $nodes[0]; $urlInfo = parse_url($node["host"]); if ($urlInfo["host"] == "127.0.0.1") { //说明迷你存储在本机,直接把127.0.0.1替换为迷你存储端口 $defaultHost = MiniHttp::getMiniHost(); $miniHostInfo = parse_url($defaultHost); $node['host'] = $miniHostInfo["scheme"] . "://" . $miniHostInfo["host"] . ":" . $urlInfo["port"] . $miniHostInfo["path"]; } return $node; } return null; } } return null; }
/** * 获得迷你文档转换服务器节点 * @param string $signature * @return string */ public function getConvertNode($signature) { //寻找以前迷你文档节点 $version = PluginMiniDocVersion::getInstance()->getBySignature($signature); if (!empty($version)) { $meta = MiniVersionMeta::getInstance()->getMeta($version["id"], "doc_id"); if (!empty($meta)) { $nodeId = $meta["meta_value"]; $node = $this->getNodeById($nodeId); if ($node["status"] == 1) { return $node; } } } //返回随机converted_file_count最小的节点 $nodes = $this->getNodeList(); $validNodes = array(); foreach ($nodes as $itemNode) { if ($itemNode["status"] == 1) { array_push($validNodes, $itemNode); } } //选出converted_file_count最小的个节点 $validNodes = MiniUtil::arraySort($validNodes, "converted_file_count", SORT_ASC); $nodes = MiniUtil::getFistArray($validNodes, 1); if (count($nodes) > 0) { return $nodes[0]; } return null; }