2012-05-01 19 views
6

Tengo un cubo con dos tipos de nombres de archivo:Amazon cambio de nombre S3 y sobrescribir los archivos, recomendaciones y riesgos

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

Por ejemplo, podría tener:

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

Quiero cambiar el nombre de todos los archivos [Bucket]/[folder]/[file] a [Bucket]/[file] archivos (y por tanto de sobrescribir/descartando los archivos [Bucket]/[file]).
Así como en el ejemplo anterior, quiero que MyBucket/foo/bar se convierta en MyBucket/bar (y sobrescriba/duscard el original MyBucket/bar).

probé dos métodos:

  1. Uso de comando de movimiento de s3cmd: s3cmd mv s3://MyBucket/foo/bar s3://MyBucket/bar
  2. Utilizando el SDK de Amazon para php: rename(s3://MyBucket/foo/bar, s3://MyBucket/bar)

Ambos métodos parecen funcionar, pero - teniendo en cuenta que tengo que hacer esto como un proceso por lotes en miles de archivos,
mis preguntas son:

  1. ¿Qué método es el preferido?
  2. ¿Hay otros métodos mejores?
  3. ¿Debo eliminar los archivos anteriores antes de mover/cambiar el nombre? (parece funcionar bien sin él, pero podría no ser consciente de los riesgos involucrados)

Gracias.

+0

¡Hola! También estoy tratando de mover y sobrescribir las carpetas (y sus archivos que residen) en un solo cubo y noté que tenías: cambiar el nombre (s3: // MyBucket/foo/bar, s3: // MyBucket/bar). ¿Cómo funciona esto en PHP? ¿O esa línea solo funciona textualmente en un EC2? – Schodemeiss

+0

@AndyBarlow, he escrito una publicación al respecto en: http://eyalarubas.com/log/2012/10/16/using-aws-s3-stream-wrapper-for-php/. Contáctame si tienes más preguntas. – EyalAr

Respuesta

4

Desde que hice esta pregunta hace 5 meses, tuve algo de tiempo para obtener algunas ideas; así que lo responderé yo mismo:

Por lo que he visto, no hay una gran diferencia en cuanto al rendimiento. Me imagino que llamar al s3cmd desde dentro de PHP puede ser costoso, debido a la invocación de un proceso externo para cada solicitud; pero, de nuevo, el SDK de Amazon usa cURL para enviar sus solicitudes, por lo que no hay mucha diferencia.

Una diferencia que noté, es que SDK de Amazon tiende a lanzar excepciones CURL (aparentemente al azar, y rara vez), pero s3cmd no se estrelló en absoluto. Mis scripts se ejecutan en decenas de miles de archivos, así que tuve que aprender de la peor manera para lidiar con estas excepciones cURL.
Mi teoría es que cURL falla cuando hay un conflicto de comunicación en el servidor (por ejemplo, cuando dos procesos intentan usar el mismo recurso). Estoy trabajando en un servidor de desarrollo en el que a veces varios procesos acceden a S3 con cURL simultáneamente; estas son las únicas situaciones en las que cURL exhibió este comportamiento.

Para concluir:
Usando s3cmd podría ser más estable, pero utilizando el SDK permite una mayor versatilidad y una mejor integración con ustedes código PHP; siempre que recuerde manejar los casos excepcionales (yo diría que 1 por cada 1000 solicitudes, cuando varios procesos se ejecutan simultáneamente) en los que el SDK arroja una excepción cURL.

2

Dado que cualquiera de los métodos, s3cmd y SDK, emitirán eveltualmente la misma llamada REST, puede elegir con seguridad la que sea mejor para usted.

Cuando se mueve un archivo, si el destino existe, siempre se reemplaza, entonces, si no desea este comportamiento, deberá verificar si el nombre del archivo de destino ya existe, para realizar o no la operación de movimiento.

+0

Gracias por su contribución. – EyalAr