对象存储可以简单理解为用来存储图片、音频、视频等非结构化数据的数据池。相对于主机服务器,具有读写速度快,利于分享的特点。我为什么建议大家使用对象存储?我总结了这六点。
一般情况下,我们都是建议使用主机服务器和对象存储分工合作的方式来存储网站数据。主机服务器主要负责存储网站的动态数据,对象存储则用来存储网站的静态文件。从而实现网站的动静分离,当用户访问一个网站时,分别从主机服务器和对象存储的服务器同步读取数据,可以大幅的提升网页性能。
理想情况下,还会结合内容分发网络来使用,这个我们以后会说到。
无论是腾讯云、阿里云、七牛云,对象存储都有单独的管理控制台,腾讯云和阿里云还有专门的电脑客户端。你不必打开网站,就可以像使用百度云盘一样使用对象存储来管理你的网站文件,除了上传、下载、预览等常用功能,还可以直接在对象存储上进行图片处理/媒体转码/数据分析等。
对象存储的本质是“内置大容量硬盘的分布式服务器”,对象存储有自己的CPU、内存、网络和磁盘系统,具备一定的智能,同一个对象存储数据池可以新建不同的存储桶(bucket),分别用来存储不同网站的数据,彼此互不干扰。而且同一个文件可以引用到不同的网站,可以有效的减少数据冗余。
假设你的图片等数据存储在你自己的服务器上,只能通过定期数据备份的方式保护你的数据。数据量大的话,每次备份都需要大量的时间和占用大量的磁盘空间,管理起来还不方便。
如果你的数据放置在对象存储的数据池了,并与网站关联。那么静态文件的备份就可以交给对象存储。你只需要对网站少量的动态文件进行备份。省时省力。
比如我使用对象存储,我在离我最近的节点【深圳】来存储网站的图片等静态文件。但是考虑到极端情况,比如深圳节点由于突然停电,可能导致数据全部丢失。但如果之前我选择了【杭州】作为第二个存储节点,而且设置【深圳】节点的数据实时增量同步到【杭州】节点。那么就算深圳节点的数据丢失了,但是我在杭州的数据还是可以使用。等到恢复供电,我再把数据从杭州节点同步回深圳节点就可以了。这就是我们说的异地容灾。
现在阿里云对象存储(简称OSS)40G容量一年的价格大概是9块钱。腾讯云对象存储(简称cos)更是有免费的50G容量,加上10G的免费下行流量。已经可以满足大部分个人站点的使用需求。不像服务器的流量是固定的,包含在服务器的费用里面了。无论你用或不用,都是这么多。对象存储可以是根据你的实际使用量进行计费。
为什么选择将这一点放在最后说呢?因为现在服务器的价格还算实惠,活动也比较多。大部分站长已经不存在服务器空间不够用的问题。而且对象存储的出现也不是为了解决服务器空间不够用的问题。而是为了结合【块存储】、【文件存储】各自的优点,从而实现高效的文件读写和分享。但是节省了服务器空间还是不争得事实,所以还是提一下吧。
七牛云开发文档:developer.qiniu.com/kodo
(一)Composer 安装 SDK(推荐使用) 进入cmd 终端,切换目录到你部署项目的根目录下,执行以下命令即可:composer require qiniu/php-sdk
(二)传统方式安装 进入七牛云,下载官方 PHP-SDK,将下载下来的SDK解压,放入项目第三库文件(vendor 或者 extend)
<?php
namespace app\cms\controller;
//引入七牛云SDK
use Qiniu\Config;
use Qiniu\Storage\BucketManager;
use think\Controller;
use Qiniu\Auth;
use Qiniu\Storage\UploadManager;
use app\cms\model\Banner as BannerModel;
class Banner extends Controller
{
//添加轮播图页面
public function addBannerHtml()
{
return view('banner/add_banner');
}
/**
* 轮播图上传接口
*/
public function uploadBanner()
{
//接收文件上传的值
$file = $_FILES;
//本地的文件路径
$localFilePath = $file['file']['tmp_name'];
//截取文件后缀名
//$suffix = '.jpg';
$suffix = strtolower(substr($file['file']['name'],strpos($file['file']['name'],'.')));
//生成一个唯一的文件名称,重命名 (md5加密原文件名+秒+随机数)
$fileName = md5($file['file']['name']) . date('s',time()) . rand(1,9999999);
$fileName .= $suffix;
//上传七牛云业务逻辑
$accessKey = ''; //去控制台的秘钥管理拿AK
$secretKey = '';//去控制台的秘钥管理拿SK
$auth = new Auth($accessKey, $secretKey);
//七牛云桶名,根据自己实际进行填写
$bucket = '';
// 生成上传Token
$token = $auth->uploadToken($bucket);
// 构建 UploadManager 对象
$uploadMgr = new UploadManager();
// 调用 UploadManager 的 putFile 方法进行文件的上传。
list($ret, $err) = $uploadMgr->putFile($token, $fileName, $localFilePath);
//错误信息提示
if ($err != null) {
//可调整为错误页面
return json([
'msg'=>'上传失败',
'code'=>201,
'result'=>''
]);
}
//把七牛云图片路径存储到我们自己的数据库 七牛云图片路径
$imageUrl = 'http://qtpud69oi.hn-bkt.clouddn.com/' . $fileName;
//入库业务逻辑 create save 只有这两个模型方法才能自动写入时间戳
$result =BannerModel::create([
'image_url'=>$imageUrl,
]);
return json([
'msg'=>'上传成功',
'code'=>200,
'result'=>$result
]);
}
/**
* 轮播图分页
*/
public function bannerList()
{
// 查询状态为1的用户数据 并且每页显示10条数据
$list = BannerModel::where('status',1)
->paginate(3);
// 渲染模板输出
return view('banner/get_list',compact('list'));
}
/**
* 删除轮播图接口
*/
public function deleteBanner()
{
//接收参数
$params = input();
//删除逻辑,删除七牛云,删除数据库数据
$banner = BannerModel::get($params['id']);
//删除七牛云
$accessKey = '';//去控制台的秘钥管理拿AK
$secretKey = '';//去控制台的秘钥管理拿SK
//七牛云桶名,根据自己实际进行填写
$bucket = '';
//域名长度
$len = strlen('http://qtpud69oi.hn-bkt.clouddn.com/');
//要删除七牛云图片路径
$delImageUrl = substr($banner->image_url,$len);
$auth = new Auth($accessKey, $secretKey);
$config = new \Qiniu\Config();
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config);
$bucketManager->delete($bucket, $delImageUrl);
//删除数据数据
$banner->delete();
return json([
'msg'=>'删除成功',
'code'=>200,
'result'=>''
]);
}
}