亚马逊s3重命名和覆盖文件,建议和风险

时间:2012-05-01 13:20:25

标签: amazon-s3 batch-rename

我有一个包含两种文件名的存储桶:

  1. [Bucket]/[file]
  2. [Bucket]/[folder]/[file]
  3. 例如,我可以:

    1. MyBucket/bar
    2. MyBucket/foo/bar
    3. 我想将所有[Bucket]/[folder]/[file]个文件重命名为[Bucket]/[file]个文件(从而覆盖/丢弃[Bucket]/[file]个文件)。
      与前面的示例一样,我希望MyBucket/foo/bar成为MyBucket/bar(并覆盖原始MyBucket/bar的/ duscard)。

      我尝试了两种方法:

      1. 使用s3cmd的移动命令:s3cmd mv s3://MyBucket/foo/bar s3://MyBucket/bar
      2. 使用亚马逊的SDK for php:rename(s3://MyBucket/foo/bar, s3://MyBucket/bar)
      3. 这两种方法似乎都有效,但是 - 考虑到我必须在数千个文件上进行批处理, 我的问题是:

        1. 首选哪种方法?
        2. 还有其他更好的方法吗?
        3. 我必须在移动/重命名之前删除旧文件吗?(没有它,它似乎工作正常,但我可能不知道涉及的风险)
        4. 谢谢。

2 个答案:

答案 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调用,因此您可以放心地选择最适合您的方法。

当您移动文件时,如果目标存在,则始终替换它,然后,如果您不想要此行为,则需要检查目标文件名是否已存在,以便执行或不执行移动行动。