2012-05-01 14 views
6

Ho un secchio con due tipi di nomi di file:Amazon S3 ridenominazione e sovrascrittura file, consigli e rischi

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

Per esempio, potrei avere:

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

voglio rinominare tutti i file [Bucket]/[folder]/[file] per [Bucket]/[file] file (e quindi sovrascrivere/scartando i file [Bucket]/[file]).
Così come nell'esempio precedente, voglio diventare MyBucket/bar (e sovrascrivere/duscard l'originale MyBucket/bar).

Ho provato due metodi:

  1. utilizzando il comando mossa di s3cmd: s3cmd mv s3://MyBucket/foo/bar s3://MyBucket/bar
  2. Utilizzando SDK di Amazon per PHP: rename(s3://MyBucket/foo/bar, s3://MyBucket/bar)

Entrambi i metodi sembrano funzionare, ma - considerando che devo fare questo come processo batch su migliaia di file,
le mie domande sono:

  1. Quale metodo è preferibile?
  2. Ci sono altri metodi migliori?
  3. È necessario eliminare i file precedenti prima dello spostamento/ridenominazione? (sembra funzionare senza di esso, ma potrei non essere consapevole dei rischi coinvolti)

Grazie.

+0

Ciao! Sto anche cercando di spostare e sovrascrivere le cartelle (e i loro file residenti) in un singolo bucket e ho notato che hai: rinominare (s3: // MyBucket/foo/bar, s3: // MyBucket/bar). Come funziona in PHP? O quella linea funziona semplicemente testualmente su un EC2? – Schodemeiss

+0

@AndyBarlow, ho scritto un post su questo in: http://eyalarubas.com/log/2012/10/16/using-aws-s3-stream-wrapper-for-php/. Contattami se hai altre domande. – EyalAr

risposta

4

Da quando ho fatto questa domanda circa 5 mesi fa, ho avuto un po 'di tempo per ottenere alcune intuizioni; quindi risponderò a me stesso:

Da quello che ho visto, non c'è nessuna differenza importante dal punto di vista delle prestazioni. Posso immaginare che chiamare s3cmd da PHP possa essere costoso, a causa del richiamo di un processo esterno per ogni richiesta; ma poi di nuovo - l'SDK di Amazon utilizza cURL per inviare le sue richieste, quindi non c'è molta differenza.

Una differenza che ho notato, è che la SDK di Amazon tende a generare eccezioni CURL (apparentemente in modo casuale, e raramente), ma s3cmd non è precipitato a tutti. I miei script girano su decine di migliaia di file, quindi ho dovuto imparare il modo difficile per gestire queste eccezioni cURL.
La mia teoria è che CURL si arresta in modo anomalo quando si verifica un conflitto di comunicazione sul server (ad esempio, quando due processi tentano di utilizzare la stessa risorsa). Sto lavorando su un server di sviluppo su cui a volte diversi processi accedono contemporaneamente a S3 con cURL; queste sono le uniche situazioni in cui CURL ha mostrato questo comportamento.

Per concludere:
Utilizzando s3cmd potrebbe essere più stabile, ma utilizzando l'SDK permette una maggiore versatilità e una migliore integrazione con te codice PHP; purché si ricordi di gestire i casi rari (direi 1 per ogni 1000 richieste, quando più processi vengono eseguiti contemporaneamente) in cui l'SDK genera un'eccezione cURL.

2

Poiché entrambi i metodi, s3cmd e SDK, emetteranno sempre la stessa chiamata REST, è possibile scegliere con sicurezza quello che è meglio per voi.

Quando si sposta un file, se esiste la destinazione, viene sempre sostituito, quindi, se non si desidera questo comportamento, sarà necessario verificare se il nome del file di destinazione esiste già, per eseguire o non l'operazione di spostamento.

+0

Grazie per l'input. – EyalAr