/** * 检查存储节点状态 * @param string $host * @return int */ public function checkNodeStatus($host) { $url = $host . '/api.php'; $data = array('route' => "store/status", 'callback_url' => PluginMiniStoreOption::getInstance()->getMiniyunHost() . "info.htm"); $http = new HttpClient(); $http->post($url, $data); $result = $http->get_body(); $result = @json_decode($result, true); if ($result["status"] == "1") { return 1; } return -1; }
/** * 把文档进行转换 * @param array $version * @param string $mimeType 如mineType为空,则使用version.mime_type */ private function pushFileConvert($version, $mimeType) { if (empty($mimeType)) { $mimeType = $version["mime_type"]; } $miniHost = PluginMiniDocOption::getInstance()->getMiniyunHost(); $siteId = MiniSiteUtils::getSiteID(); $signature = $version["file_signature"]; $node = PluginMiniDocNode::getInstance()->getConvertNode($signature); if (!empty($node)) { $url = $node["host"] . '/api.php?route=file/convert'; $downloadUrl = $miniHost . "api.php?route=module/miniDoc/download&signature=" . $signature; $callbackUrl = $miniHost . "api.php?route=module/miniDoc/report&node_id=" . $node["id"] . "&signature=" . $signature; $data = array('signature' => $signature, 'site_id' => $siteId, 'mime_type' => $mimeType, 'download_url' => $downloadUrl, "callback_url" => $callbackUrl); $http = new HttpClient(); $http->post($url, $data); $result = $http->get_body(); $result = json_decode($result, true); if ($result['status'] == 1) { $this->updateDocConvertStatus($node["id"], $version["file_signature"], 1); } } }
/** * 根据关键字+SiteId向迷你搜索发送请求 * @param string $key 关键字 * @param string $siteId 站点ID * @return array 返回signature列表 */ private function searchKeyWordAndSiteId($siteId, $key) { $opts = array("before_match" => "<span style='background-color: #ffff00'><b>", "after_match" => "</b></span>", "chunk_separator" => " ... ", "limit" => 150, "around" => 75); //向迷你搜索服务器发送搜索请求 $node = PluginMiniSearchNode::getInstance()->getBestNode(); if (!empty($node)) { $url = $node["host"] . '/api.php'; $data = array('route' => "file/search", 'site_id' => $siteId, 'key' => $key); foreach ($opts as $key => $value) { $data[$key] = $value; } $http = new HttpClient(); $http->post($url, $data); $body = $http->get_body(); $body = json_decode($body, true); if ($body['status'] == 1) { PluginMiniSearchNode::getInstance()->newSearch($node["id"]); return $body["result"]; } } return array(); }
/** * 推送任务到文件冗余备份服务器 * @param $miniHost * @param $task */ private function pushReplicateTask($miniHost, $task) { $node = PluginMiniStoreNode::getInstance()->getNodeById($task->node_id); //如目标服务器不可用,则不用发送请求 if ($node["status"] == 1) { $signature = $task->file_signature; $version = MiniVersion::getInstance()->getBySignature($signature); $downloadUrl = $miniHost . "api.php?route=module/miniStore/download&signature=" . $signature; $callbackUrl = $miniHost . "api.php?route=module/miniStore/replicateReport&signature=" . $signature . "&node_id=" . $node["id"]; //向迷你存储发送冗余备份请求 $data = array('route' => "file/replicate", 'size' => $version["file_size"], 'signature' => $signature, 'download_url' => $downloadUrl, "callback_url" => $callbackUrl); $http = new HttpClient(); $http->post($node["host"] . "/api.php", $data); $content = $http->get_body(); if (!empty($content)) { $status = @json_decode($content)->{"status"}; if ($status == 1) { //目标服务器接受请求后,更改任务状态 $task->status = 1; $task->save(); } } } }
/** * 编制索引 * @param $miniHost * @param $siteId * @param $task */ private function buildTask($miniHost, $siteId, $task) { $nodeId = $task->node_id; $signature = $task->file_signature; $node = PluginMiniSearchNode::getInstance()->getNodeById($nodeId); if (!empty($node)) { $url = $node["host"] . '/api.php?route=file/build'; $downloadUrl = $miniHost . "api.php?route=module/miniSearch/downloadTxt&signature=" . $signature; $callbackUrl = $miniHost . "api.php?route=module/miniSearch/report&node_id=" . $node["id"] . "&signature=" . $signature; $data = array('signature' => $signature, 'site_id' => $siteId, 'download_url' => $downloadUrl, "callback_url" => $callbackUrl); $http = new HttpClient(); $http->post($url, $data); $result = $http->get_body(); $result = @json_decode($result, true); if ($result['status'] == 1) { //修改task状态 $task->status = 1; $task->save(); } } }
/** * 在线浏览文件获得内容 * @param string $path 文件当前路径 * @param string $type 文件类型,可选择pdf/png * @throws * @return NULL */ public function previewContent($path, $type) { $file = MiniFile::getInstance()->getByPath($path); // 权限处理 if (empty($file)) { return array('success' => false, 'msg' => 'file not existed'); } $fileBiz = new FileBiz(); $canRead = $fileBiz->privilege($path); if (!$canRead) { throw new MFileopsException(Yii::t('api', 'no permission'), MConst::HTTP_CODE_409); } //获得文件当前版本对应的version $version = PluginMiniDocVersion::getInstance()->getVersion($file["version_id"]); $signature = $version["file_signature"]; $localPath = PluginMiniDocOption::getInstance()->getMiniDocCachePath() . $signature . "/" . $signature . "." . $type; if (!file_exists($localPath)) { //文档还在转换中 $node = PluginMiniDocNode::getInstance()->getConvertNode($signature); if (empty($node)) { throw new MFileopsException(Yii::t('api', 'convert error'), MConst::HTTP_CODE_412); } //根据情况判断是否需要向迷你文档拉取内容 $parentPath = dirname($localPath); //如果缓存目录不存在,则需要创建 if (!file_exists($parentPath)) { MUtils::MkDirsLocal($parentPath); } //文件不存在,则需要从迷你文档拉取文件内容 $url = PluginMiniDocNode::getInstance()->getDownloadUrl($node["id"], $version, $type); $http = new HttpClient(); $http->get($url); $status = $http->get_status(); if ($status == "200") { $content = $http->get_body(); //把文件内容存储到本地硬盘 file_put_contents($localPath, $content); Yii::log($signature . " get " . $type . " success", CLogger::LEVEL_INFO, "doc.convert"); } else { if (!($version["doc_convert_status"] == -1)) { //如迷你文档服务器不存在该文档,说明迷你文档服务器发生了变动 //这个时候自动启动负载均衡机制,把文档重新转换 PluginMiniDocVersion::getInstance()->pushConvertSignature($signature, ""); Yii::log($signature . " get " . $type . " error", CLogger::LEVEL_ERROR, "doc.convert"); } } } if (file_exists($localPath)) { if ($type === "png") { $contentType = "image/png"; } if ($type === "pdf") { $contentType = "Content-type: application/pdf"; } //Firefox+混合云模式下直接输出内容 //其它浏览器使用sendfile模式输出内容 $isSendFile = true; if (MiniUtil::isMixCloudVersion()) { $ua = isset($_SERVER["HTTP_USER_AGENT"]) ? $_SERVER["HTTP_USER_AGENT"] : NULL; if (strpos($ua, "Firefox") > 0 || strpos($ua, "Safari") > 0) { $isSendFile = false; } } if ($isSendFile) { header('Location: ' . MiniHttp::getMiniHost() . "assets/minidoc/" . $signature . "/" . $signature . "." . $type); } else { Header("Content-type: " . $contentType); echo file_get_contents($localPath); exit; } } }