6

2種類のファイル名を持つバケットがあります。

  1. [Bucket]/[file]
  2. [Bucket]/[folder]/[file]

たとえば、次のようになります。

  1. MyBucket/bar
  2. MyBucket/foo/bar

[Bucket]/[folder]/[file]すべてのファイルの名前をファイルに変更したい[Bucket]/[file](したがって、ファイルを上書き/破棄したい[Bucket]/[file])。
前の例のように、私はなりたいですMyBucket/foo/barMyBucket/barそしてオリジナルを上書き/ダスカードしますMyBucket/bar)。

私は2つの方法を試しました:

  1. s3cmdのmoveコマンドの使用:s3cmd mv s3://MyBucket/foo/bar s3://MyBucket/bar
  2. AmazonのSDKforphpの使用:rename(s3://MyBucket/foo/bar, s3://MyBucket/bar)

どちらの方法も機能しているように見えますが、これを何千ものファイルのバッチプロセスとして実行する必要があることを考えると、
私の質問は次のとおりです。

  1. どちらの方法が好ましいですか?
  2. 他にもっと良い方法はありますか?
  3. 移動/名前変更の前に古いファイルを削除する必要がありますか?(それがなくても問題なく動作するようですが、関連するリスクを認識していない可能性があります)

ありがとうございました。

4

2 に答える 2

5

約 5 か月前にこの質問をして以来、いくつかの洞察を得る時間がありました。だから私は自分で答えます:

私が見たところ、パフォーマンスに関して大きな違いはありませんs3cmdリクエストごとに外部プロセスを呼び出すため、PHP 内からの呼び出しはコストがかかる可能性があると想像できます。繰り返しになりますが、Amazon の SDK は cURL を使用してリクエストを送信するため、大きな違いはありません。

私が気付いた違いの 1 つは、Amazon の SDK が cURL 例外をスローする傾向があることです(ランダムに、めったにないように見えます) が、s3cmdまったくクラッシュしませんでした。私のスクリプトは何万ものファイルで実行されるため、これらの cURL 例外を処理する難しい方法を学ばなければなりませんでした。
私の理論では、サーバー上で通信の競合が発生すると (たとえば、2 つのプロセスが同じリソースを使用しようとした場合)、cURL がクラッシュするというものです。私は、複数のプロセスが同時に cURL を使用して S3 にアクセスする開発サーバーで作業しています。これらは、cURL がこの動作を示した唯一の状況です。

結論として
、SDK を 使用s3cmdするとより安定する可能性がありますが、SDK を使用すると汎用性が高まり、PHP コードとの統合が向上します。SDK が cURL 例外をスローするまれなケース (複数のプロセスが同時に実行される場合、1000 リクエストごとに 1 つと言います) を処理することを覚えている限り。

于 2012-10-16T11:47:56.883 に答える
2

s3cmd と SDK のどちらのメソッドも同じ REST 呼び出しを最終的に発行するため、最適な方を安全に選択できます。

ファイルを移動するとき、ターゲットが存在する場合は常に置き換えられます。この動作が望ましくない場合は、移動操作を実行するかどうかを確認するために、ターゲット ファイル名が既に存在するかどうかを確認する必要があります。 .

于 2012-08-11T20:32:19.753 に答える