2012-05-01 85 views
6

我有二種文件名的水桶:Amazon S3的重命名和覆蓋文件,建議和風險

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

例如,我可以有:

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

我想所有的[Bucket]/[folder]/[file]文件重命名爲[Bucket]/[file]文件(從而覆蓋/丟棄[Bucket]/[file]文件)。
所以和前面的例子一樣,我想MyBucket/foo/bar變成MyBucket/bar(並且覆蓋/ duscard原來的MyBucket/bar)。

我嘗試了兩種方法:

  1. 使用s3cmd的移動命令:s3cmd mv s3://MyBucket/foo/bar s3://MyBucket/bar
  2. 使用Amazon的SDK爲PHP:rename(s3://MyBucket/foo/bar, s3://MyBucket/bar)

這兩種方法似乎工作,但是 - 考慮到我需要做的這作爲批量處理上千個文件,
我的問題是:

  1. 哪種方法是首選?
  2. 還有其他更好的方法嗎?
  3. 我必須在移動/重命名之前刪除舊文件嗎?(它似乎沒有它工作正常,但我可能不知道涉及的風險)

謝謝。

+0

您好!我也試圖移動和覆蓋文件夾(及其駐留文件)在一個桶中,我注意到你有:重命名(s3:// MyBucket/foo/bar,s3:// MyBucket/bar)。這在PHP中如何工作?或者,這條線是否僅僅在EC2上起作用? – Schodemeiss

+0

@AndyBarlow,我寫了一篇關於它的文章:http://eyalarubas.com/log/2012/10/16/using-aws-s3-stream-wrapper-for-php/。如果您有更多問題,請與我聯繫。 – EyalAr

回答

4

由於大約5個月前我問過這個問題,我有一段時間來獲得一些見解;所以我會自己回答:

從我看到的,沒有性能明顯差異。我可以想象,從PHP內部調用s3cmd可能是昂貴的,因爲爲每個請求調用一個外部進程;但是再次 - 亞馬遜的SDK使用cURL發送它的請求,所以沒有太大區別。

一個區別我也注意到,就是Amazon的SDK往往拋出異常捲曲(看似隨機,也很少),但s3cmd沒有崩潰的。我的腳本在成千上萬的文件上運行,所以我必須學會處理這些cURL異常的難題。
我的理論是當服務器發生通信衝突時(例如,當兩個進程嘗試使用相同的資源時)cURL崩潰。我在開發服務器上工作,有時幾個進程同時使用cURL訪問S3;這些是cURL展示此行爲的唯一情況。

對於結論:
使用s3cmd可能會更穩定,但使用SDK允許更多的靈活性和更好的整合與你的PHP代碼;只要您記得處理少數情況(我會在每個1000請求中說1,當多個進程同時運行時),其中SDK引發cURL異常。

2

由於s3cmd和SDK兩種方法都會發出相同的REST調用,所以您可以安全地選擇最適合您的方法。

當你移動一個文件時,如果目標存在,它總是被替換,那麼,如果你不想要這個行爲,你需要檢查目標文件名是否已經存在,以便執行或不是移動操作。

+0

感謝您的意見。 – EyalAr