/**
  * 获得最好的的迷你搜索节点
  * 先找出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;
 }
Esempio n. 2
0
 /**
  * 获得有效文件下载服务器节点
  * 找到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;
 }
Esempio n. 3
0
 /**
  * 获得迷你文档转换服务器节点
  * @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;
 }