文档章节

关于aws S3文件上传的锁问题

o0无忧亦无怖
 o0无忧亦无怖
发布于 2017/02/17 13:35
字数 648
阅读 12
收藏 0
点赞 0
评论 0

#问题出现情况 由于客户端是(安卓、iOS、PC)多个版本的,因此,要传不同的文件到S3服务器,但是在上传完毕之后,出现了无法删除本地文件的提示 “text file busy”

#问题的分析 text file busy 即文件正忙,因此可能出现的原因有:

1.文件还没有上传完

2.文件被进程锁定了

3.文件资源没有被释放(因为aws的SDK是封装好的,因此当时我相信了他,么有考虑这一点,最后发现居然就是这一点)

#查看官方文档

public Guzzle\Service\Resource\Model putObject( array $args = array() )

$arg是参数

$result = $client->putObject(array(
    'ACL' => 'string',
    'Body' => 'mixed type: string|resource|\Guzzle\Http\EntityBodyInterface',
    // Bucket is required
    'Bucket' => 'string',
    'CacheControl' => 'string',
    'ContentDisposition' => 'string',
    'ContentEncoding' => 'string',
    'ContentLanguage' => 'string',
    'ContentLength' => integer,
    'ContentType' => 'string',
    'Expires' => 'mixed type: string (date format)|int (unix timestamp)|\DateTime',
    'GrantFullControl' => 'string',
    'GrantRead' => 'string',
    'GrantReadACP' => 'string',
    'GrantWriteACP' => 'string',
    // Key is required
    'Key' => 'string',
    'Metadata' => array(
        // Associative array of custom 'string' key names
        'string' => 'string',
        // ... repeated
    ),
    'ServerSideEncryption' => 'string',
    'StorageClass' => 'string',
    'WebsiteRedirectLocation' => 'string',
    'SSECustomerAlgorithm' => 'string',
    'SSECustomerKey' => 'string',
    'SSECustomerKeyMD5' => 'string',
    'SSEKMSKeyId' => 'string',
    'RequestPayer' => 'string',
));

官方示例

$result = $client->putObject(array(
    'Bucket' => $bucket,
    'Key'    => 'data.txt',
    'Body'   => 'Hello!'
));

#强制获取文件返回方式(DEBUG过程) 首先,我们尝试用获取到返回值回调的方式进行判断(我们认为是文件还在上传过程中)。下面是官方的demo:

$result = $client->putObject(array(
    'Bucket'     => $bucket,
    'Key'        => 'data_from_file.txt',
    'SourceFile' => $pathToFile,
    'Metadata'   => array(
        'Foo' => 'abc',
        'Baz' => '123'
    )
));

// We can poll the object until it is accessible
$client->waitUntil('ObjectExists', array(
    'Bucket' => $this->bucket,
    'Key'    => 'data_from_file.txt'
));

然而问题并没有得到解决,但是文件很明显的是上传上去了的。同时,证明了putObject是个同步的操作而不是异步,因为他产生了很明显的延迟。

#继续查阅文档

$client->putObject(array(
    'Bucket' => $bucket,
    'Key'    => 'data_from_stream.txt',
    'Body'   => fopen($pathToFile, 'r+')
));

发现S3上传是可以通过资源或者字符流方式进行上传,因此,修改代码。

    try{
			if(isset($data['SourceFile'])) {
				$data['Body'] = fopen($data['SourceFile'],'r+');
				unset($data['SourceFile']);
			}
			$this->_s3->putObject($data);
			fclose($data['Body']);
		} catch(\Exception $e) {
			return $e->getMessage();
	}

不再相信S3会自动释放文件资源,果然,本地文件已被删除。

#推测

AWS的S3的SDK是没有对文件进行释放,而它内部普遍采用static的方法和类,因此文件释放的时机是由PHP决定。 所以出现了text file busy的错误。

#解决方案

不要相信SDK能处理好一切,对于本地的资源类型和需要上锁的操作交由自己来管理。

© 著作权归作者所有

共有 人打赏支持
o0无忧亦无怖
粉丝 33
博文 73
码字总数 49253
作品 1
程序员
Linux服务器通过aws命令行上传文件至S3

目的 Linux服务器通过AWS命令行上传文件至S3 配置 打开你的AWS控制台; 连接你的Linux服务器,按照以下步骤操作; # 安装pip yum -y install python-pip # 安装awscli pip install awscli #...

M玺 ⋅ 2017/05/17 ⋅ 0

为什么是无服务器计算?第一手AWS lambda测试报告!

摘要:第一手的一步一步的,带你体验亚马逊“函数即服务(function as aservice)”平台。 为什么一名开发者应该使用AWS Lambda?简单一句话的说,AWS Lambda-是另外一种事件驱动方式,“fun...

xiaoli110 ⋅ 2017/10/28 ⋅ 0

AWS亚马逊S3云储存怎么批量上传文件夹?用Python吧!

AWS S3 在浏览器没有拖动文件夹上传的功能,手动维护文件实在是太过辛苦了,用Python API吧! AWS S3 才是当今世界上最大的云存储。虽然 S3 服务的对象多为企业用户,你同样可以使用它搭建个...

阿锋zxf ⋅ 05/16 ⋅ 0

从AWS S3换成阿里云OSS存储所踩的坑

因业务需要,AWS S3 不能使用了,要换成阿里云OSS存储和下载。简单作以记录,以作备忘。 1.参照https://help.aliyun.com/product/31815.html?spm=5176.2020520105.146.d500.30285e77DhksTQ ...

wqhlmark64 ⋅ 2017/12/22 ⋅ 0

amazon s3 简单使用

S3全称叫做 Amazon Simple Storage Service ,简单存储服务,Scalable Storage in the Cloud ,可扩展的云存储。 好消息 AWS Free Usage Tier As part of the AWS Free Usage Tier, you can ......

topdogs ⋅ 2012/01/17 ⋅ 0

AWS 的 S3 故障回顾和思考

继Gitlab的误删除数据事件没几天,“不沉航母” AWS S3 (Simple Storage Service)几天前也“沉”了4个小时,墙外的半个互联网也跟着挂了。如约,按 AWS 惯例,AWS今天给出了一个简单的故障...

陈皓 ⋅ 2017/03/03 ⋅ 0

简单几步,部署一个可扩展微服务系统!

  【IT168 技术】当你构建一个微服务时,你最看重什么?一个完全管理和可扩展的系统?因为托管代码的选择有很多,例如EC2,ECS,Elastic Beanstalk,Lambda,所以很多人不知道该如何下手。虽...

it168网站 ⋅ 2017/12/18 ⋅ 0

Laravel5.2之Filesystem-从Dropbox中下载文件到AWS S3

说明:本文主要讲述了Laravel的文件系统Filesystem的小Demo,逻辑不复杂,主要就是把Dropbox上的一个文件下载到本地local,和下载到AWS S3中。用到的文件库filesystem主要是:league/flysys...

botkenni ⋅ 2016/10/24 ⋅ 0

如何在AWS平台导入自行创建的操作系统模板并创建EC2实例

如何在AWS平台导入自行创建的操作系统模板并创建EC2实例 AWS平台提供的AMI,尤其是国内AMI数量甚少,社区非官方提供的各类AMI我们使用起来又充满忧虑 所以,自行安装系统导入AWS平台成为一个...

nicholaszry ⋅ 2017/05/12 ⋅ 0

链家网8000+万个文件何处安家?

房产中介来由已久,“牙人”便是唐代时对中介人的称呼。无论买房、卖房还是租房,绝大多数房产相关的商业行为都离不开中介。从实体店到线上,从网站到移动App,从内部系统到2C业务,与蓬勃发...

玄学酱 ⋅ 05/10 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

6.1 压缩打包介绍 6.2 gzip压缩工具 6.3 bzip2压缩工具 6.4 xz压缩工具

压缩打包介绍 使用压缩工具的好处: 使用压缩文件,不仅可以节省磁盘空间,而且在传输时还能节省网络宽带。 我们通常讲的家用宽带和机房宽带100M是有区别的: 机房宽带的上行和下行都是100M,...

Linux_老吴 ⋅ 9分钟前 ⋅ 0

SpringBoot热部署加持

概述 进行SpringBoot的Web开发过程中,我们很多时候经常需要重启Web服务器才能保证修改的 源代码文件、或者一些诸如xml的配置文件、以及一些静态文件生效,这样耗时又低效。所谓的热部署指的...

CodeSheep ⋅ 15分钟前 ⋅ 0

OSChina 周六乱弹 —— 假如你被熊困到树上

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《如果写不出好的和弦就该在洒满阳光的钢琴前一起吃布丁》 《如果写不出好的和弦就该在洒满阳光的钢琴前一起吃布丁》- 谢...

小小编辑 ⋅ 46分钟前 ⋅ 5

vbs 取文件大小 字节

dim namedim fs, s'name = Inputbox("姓名")'msgbox(name)set fs = wscript.createobject("scripting.filesystemobject") 'fs为FSO实例if (fs.folderexists("c:\temp"))......

vga ⋅ 今天 ⋅ 1

高并发之Nginx的限流

首先Nginx的版本号有要求,最低为1.11.5 如果低于这个版本,在Nginx的配置中 upstream web_app { server 到达Ip1:端口 max_conns=10; server 到达Ip2:端口 max_conns=10; } server { listen ...

算法之名 ⋅ 今天 ⋅ 0

Spring | IOC AOP 注解 简单使用

写在前面的话 很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不...

Wenyi_Feng ⋅ 今天 ⋅ 0

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 今天 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部