/** * 获取系统已用空间 */ public function getUsedSpace() { $storeData = MiniUtil::getPluginMiniStoreData(); if (empty($storeData)) { //非迷你存储模式 $remain = $this->getDiskFreeSpace(); //空闲空间 字节 $total = $this->getDiskTotalSpace(); //总空间 字节 $usedSpace = $this->_byteFormat(MiniVersion::getInstance()->getTotalSize()); $totalSpace = $this->_byteFormat($total); $usedPercentage = $this->getUsedPercent(); //已用空间占的百分比 } else { //迷你存储模式下,获得迷你存储所有节点的空间使用情况 $usedSpace = 0; $totalSpace = 0; $usedPercentage = 100; $nodes = PluginMiniStoreNode::getInstance()->getNodeList(); foreach ($nodes as $node) { if ($node["status"] == 1) { $url = $node["host"] . "/api.php?route=store/info"; $content = file_get_contents($url); if ($content != "") { $disks = json_decode($content); foreach ($disks as $disk) { $usedSpace += $disk->{"used"}; $totalSpace += $disk->{"total"}; } } } } if ($totalSpace > 0) { $usedPercentage = round($usedSpace / $totalSpace, 3) * 100; } $usedSpace = round($usedSpace / 1024 / 1024, 2); $totalSpace = round($totalSpace / 1024 / 1024, 2); } //获得缓存空间大小 $tempDirectory = $this->getDirectorySize(BASE . 'temp'); $tempSize = $tempDirectory['size']; $cacheSize = $this->countCache(); $cacheSpace = MiniUtil::formatSize($tempSize + $cacheSize); $data = array(); $data['usedSpace'] = $usedSpace; $data['totalSpace'] = $totalSpace; $data['usedPercentage'] = $usedPercentage; $data['cacheSpace'] = $cacheSpace; return $data; }
/** * 设置站点信息 * @param $site * @return array */ public function settingSiteInfo($site) { //迷你存储没有启用,将判断用户存储路径的完整性 $storeData = MiniUtil::getPluginMiniStoreData(); if (empty($storeData)) { $fileStorePath = $site['fileStorePath']; //文件存储路径的合法性检测 if (is_dir($fileStorePath) == false) { return array('success' => false, 'msg' => 'dir_is_not_exist'); } // // 判断父目录是否存在 // if (file_exists(dirname($fileStorePath)) == false) { return array('success' => false, 'msg' => 'parent_dir_is_not_exist'); } // // 文件不存在 // if (file_exists($fileStorePath) == false) { mkdir($fileStorePath); chmod($fileStorePath, 0755); } // // 文件夹不可写 // if (is_writable($fileStorePath) == false) { return array('success' => false, 'msg' => 'dir_is_not_writable'); } //修改文件存储配置 $this->setStorePath($site['fileStorePath']); } MiniOption::getInstance()->setOptionValue("miniyun_host", $site['miniyun_host']); MiniOption::getInstance()->setOptionValue("site_title", $site['siteTitle']); MiniOption::getInstance()->setOptionValue("site_name", $site['siteName']); MiniOption::getInstance()->setOptionValue("site_default_space", $site['siteDefaultSpace']); MiniOption::getInstance()->setOptionValue("site_company", $site['siteCompany']); MiniOption::getInstance()->setOptionValue("user_register_enabled", $site['userRegisterEnabled']); //如果是混合云版,则调整迷你存储的访问地址 if (MiniUtil::isMixCloudVersion()) { $plugins = MiniUtil::getActivedPluginsInfo(); if (!empty($plugins)) { foreach ($plugins as $plugin) { if ($plugin["name"] === "miniStore") { //创建默认迷你存储站点 PluginMiniStoreNode::getInstance()->createDefault(); } } } } return array('success' => true); }
/** * 获得有效文件下载地址 * @param string $signature 文件内容hash * @param string $fileName 文件名 * @param string $mimeType 文件的mimeType * @param int $forceDownload 是否要文件下载 * @return string */ public function getDownloadUrl($signature, $fileName, $mimeType, $forceDownload) { $node = $this->getDownloadNode($signature); if (!empty($node)) { //迷你存储服务器下载文件地址 //对网页的处理分为2种逻辑,-1种是直接显示内容,1种是文件直接下载 $data = array("route" => "file/download", "signature" => $signature, "node_id" => $node["id"], "file_name" => urlencode($fileName), "mime_type" => $mimeType, "force_download" => $forceDownload); $url = $node["host"]; if (substr($url, strlen($url) - 1, 1) != "/") { $url .= "/"; } $url .= "api.php?"; foreach ($data as $key => $value) { $url .= "&" . $key . "=" . $value; } //更新迷你存储节点状态,把新上传的文件数+1 PluginMiniStoreNode::getInstance()->newDownloadFile($node["id"]); return $url; } return null; }
/** * 修改迷你存储节点状态 * @param string $name 节点名称 * @param string $status 节点状态 * @throws MiniException */ public function modifyNodeStatus($name, $status) { $node = PluginMiniStoreNode::getInstance()->getNodeByName($name); if (empty($node)) { throw new MiniException(100103); } if ($status == 1) { //检查服务器状态,看看是否可以连接迷你存储服务器 $nodeStatus = PluginMiniStoreNode::getInstance()->checkNodeStatus($node["host"]); if ($nodeStatus == -1) { throw new MiniException(100104); } } return PluginMiniStoreNode::getInstance()->modifyNodeStatus($name, $status); }
/** * 为前30个文件生成冗余备份任务 * 并把任务推送到备份服务器 * @param int $limit * @return int */ public function replicateFile($limit = 30) { $miniHost = PluginMiniStoreOption::getInstance()->getMiniyunHost(); $criteria = new CDbCriteria(); $criteria->condition = "replicate_status=0"; $criteria->limit = $limit; $criteria->offset = 0; $versions = FileVersion::model()->findAll($criteria); $fileCount = 0; foreach ($versions as $version) { //设置replicate_status=1 $signature = $version->file_signature; $version->replicate_status = 1; $version->save(); //为其它节点生成冗余备份记录 $nodes = PluginMiniStoreNode::getInstance()->getReplicateNodes($signature); foreach ($nodes as $node) { $task = ReplicateTask::model()->find("file_signature=:file_signature and node_id=:node_id", array("file_signature" => $signature, "node_id" => $node["id"])); if (!isset($task)) { $task = new ReplicateTask(); $task->file_signature = $signature; $task->node_id = $node["id"]; $task->status = 0; $task->save(); $this->pushReplicateTask($miniHost, $task); $fileCount++; } } } return $fileCount; }
/** *获得插件信息 * @param $plugins 插件列表 * { * "miniDoc":{} * } * @return array */ function setPluginInfo($plugins) { if (empty($plugins)) { $plugins = array(); } $storeNode = PluginMiniStoreNode::getInstance()->getUploadNode(); $data = array("node" => $storeNode); array_push($plugins, array("name" => "miniStore", "data" => $data)); return $plugins; }
/** * 定时任务入口 * 场景1:检查各个迷你云节点状态 * 使用方式:每隔15秒执行一次 */ public function actionCheckNodeStatus() { PluginMiniStoreNode::getInstance()->checkNodesStatus(); }