发布时间:2024-07-21 17:01
对象存储可以简单理解为用来存储图片、音频、视频等非结构化数据的数据池。相对于主机服务器,具有读写速度快,利于分享的特点。
一般情况下,我们都是建议使用主机服务器和对象存储分工合作的方式来存储网站数据。主机服务器主要负责存储网站的动态数据,对象存储则用来存储网站的静态文件。从而实现网站的动静分离,当用户访问一个网站时,分别从主机服务器和对象存储的服务器同步读取数据,可以大幅的提升网页性能。
理想情况下,还会结合内容分发网络来使用,这个我们以后会说到。
无论是腾讯云、阿里云、七牛云,对象存储都有单独的管理控制台,腾讯云和阿里云还有专门的电脑客户端。你不必打开网站,就可以像使用百度云盘一样使用对象存储来管理你的网站文件,除了上传、下载、预览等常用功能,还可以直接在对象存储上进行图片处理/媒体转码/数据分析等。
对象存储的本质是“内置大容量硬盘的分布式服务器”,对象存储有自己的CPU、内存、网络和磁盘系统,具备一定的智能,同一个对象存储数据池可以新建不同的存储桶(bucket),分别用来存储不同网站的数据,彼此互不干扰。而且同一个文件可以引用到不同的网站,可以有效的减少数据冗余。
假设你的图片等数据存储在你自己的服务器上,只能通过定期数据备份的方式保护你的数据。数据量大的话,每次备份都需要大量的时间和占用大量的磁盘空间,管理起来还不方便。
如果你的数据放置在对象存储的数据池了,并与网站关联。那么静态文件的备份就可以交给对象存储。你只需要对网站少量的动态文件进行备份。省时省力。
比如我使用对象存储,我在离我最近的节点【深圳】来存储网站的图片等静态文件。但是考虑到极端情况,比如深圳节点由于突然停电,可能导致数据全部丢失。但如果之前我选择了【杭州】作为第二个存储节点,而且设置【深圳】节点的数据实时增量同步到【杭州】节点。那么就算深圳节点的数据丢失了,但是我在杭州的数据还是可以使用。等到恢复供电,我再把数据从杭州节点同步回深圳节点就可以了。这就是我们说的异地容灾。
现在阿里云对象存储(简称OSS)40G容量一年的价格大概是9块钱。腾讯云对象存储(简称cos)更是有免费的50G容量,加上10G的免费下行流量。已经可以满足大部分个人站点的使用需求。不像服务器的流量是固定的,包含在服务器的费用里面了。无论你用或不用,都是这么多。对象存储可以是根据你的实际使用量进行计费。
为什么选择将这一点放在最后说呢?因为现在服务器的价格还算实惠,活动也比较多。大部分站长已经不存在服务器空间不够用的问题。而且对象存储的出现也不是为了解决服务器空间不够用的问题。而是为了结合【块存储】、【文件存储】各自的优点,从而实现高效的文件读写和分享。但是节省了服务器空间还是不争得事实,所以还是提一下吧。
public function UploadFile(Request $request)
{
$pathName = $request->file('pic')->getPathname();
$url = (new Oss())->aliYunUpload($pathName);
return ['error_code'=>0,'msg'=>'添加成功','data'=>['url'=>$url]];
}
public function aliYunUpload($pathName)
{
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号 进行API访问或日常运维,请登录RAM控制台创建RAM账号。
$accessKeyId = "";
$accessKeySecret = "";
// Endpoint以杭州为例,其它Region请按实际情况填写。
$endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 设置存储空间名称。
$bucket= "";
// 上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg
$fileName = md5(time() . $pathName . rand(1111, 999999));
//这里呢我直接把文件后缀固定了,可以根据自己的需要修改
$object = date('Y-m-d', time()) . '/' . $fileName . '.jpg';
//获取二进制文件流
//$content = file_get_contents($pathName);
try {
$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
//$content 文件内容,字符串上传
//$ossClient->putObject($bucket, $object, $content);
//文件上传 $pathName临时文件路径
$url = $ossClient->uploadFile($bucket, $object, $pathName)['info']['url'];
//返回文件链接
return $url;
} catch (OssException $e) {
exit($e->getMessage());
}
}