我有一个包含两种文件名的存储桶:
[Bucket]/[file]
[Bucket]/[folder]/[file]
例如,我可以:
MyBucket/bar
MyBucket/foo/bar
我想将所有[Bucket]/[folder]/[file]
个文件重命名为[Bucket]/[file]
个文件(从而覆盖/丢弃[Bucket]/[file]
个文件)。
与前面的示例一样,我希望MyBucket/foo/bar
成为MyBucket/bar
(并覆盖原始MyBucket/bar
的/ duscard)。
我尝试了两种方法:
s3cmd mv s3://MyBucket/foo/bar s3://MyBucket/bar
rename(s3://MyBucket/foo/bar, s3://MyBucket/bar)
这两种方法似乎都有效,但是 - 考虑到我必须在数千个文件上进行批处理, 我的问题是:
谢谢。
答案 0 :(得分:4)
自从我5个月前提出这个问题以来,我有时间获得一些见解;所以我会自己回答:
从我所看到的,在性能方面没有重大差异。我可以想象,由于为每个请求调用一个外部进程,从PHP中调用s3cmd
可能代价很高;但是又一次 - 亚马逊的SDK使用cURL来发送它的请求,所以没有太大区别。
我注意到的一个区别是,亚马逊的SDK往往会抛出cURL异常(看似随机,很少),但s3cmd
根本没有崩溃。我的脚本运行在成千上万的文件中,所以我必须学习处理这些cURL异常的难题。
我的理论是,当服务器上存在通信冲突时,cURL会崩溃(例如,当两个进程尝试使用相同的资源时)。我正在开发一个开发服务器,有时几个进程同时使用cURL访问S3;这些是cURL表现出这种行为的唯一情况。
结论:
使用s3cmd
可能会更稳定,但使用SDK可以提供更多功能并更好地与PHP代码集成;只要你记得处理罕见的情况(我会在每次1000个请求中说1,当多个进程同时运行时),其中SDK会抛出一个cURL异常。
答案 1 :(得分:2)
由于s3cmd和SDK中的任何一种方法都可以发出相同的REST调用,因此您可以放心地选择最适合您的方法。
当您移动文件时,如果目标存在,则始终替换它,然后,如果您不想要此行为,则需要检查目标文件名是否已存在,以便执行或不执行移动行动。