Amazon S3 proporciona una sencilla interfaz de servicios web que puede utilizarse para almacenar y recuperar cualquier cantidad de datos, en cualquier momento, desde cualquier lugar de la web. Ofrece a cualquier desarrollador acceso a la misma infraestructura de almacenamiento de datos altamente escalable, fiable, rápida y económica que Amazon utiliza para gestionar su propia red global de sitios web. El servicio busca maximizar los beneficios de la escala y trasladarlos a los desarrolladores.
Antes de empezar a usar Zend_Service_Amazon_S3, debe
registrarse primero para obtener una cuenta. Consulte la página
S3 FAQ
del sitio web de Amazon para obtener más información.
Tras registrarse, recibirá una clave de aplicación y una clave secreta. Necesitará ambas para acceder al servicio S3.
La clase Zend_Service_Amazon_S3 proporciona el
envoltorio PHP para la interfaz REST de Amazon S3. Consulte la
documentación
de Amazon S3 para una descripción detallada del servicio. Necesitará
estar familiarizado con los conceptos básicos para poder usar este servicio.
Zend_Service_Amazon_S3 proporciona la siguiente funcionalidad:
Un único punto para configurar sus credenciales de autenticación de amazon.s3 que pueden utilizarse en todos los espacios de nombres de amazon.s3.
Un objeto proxy más cómodo de usar que un cliente HTTP por sí solo, eliminando en su mayor parte la necesidad de construir manualmente peticiones HTTP POST para acceder al servicio REST.
Un envoltorio de respuesta que analiza el cuerpo de cada respuesta y lanza una excepción si se produce un error, evitando la necesidad de comprobar repetidamente el éxito de muchos comandos.
Métodos de conveniencia adicionales para algunas de las operaciones más comunes.
Una vez que se haya registrado en Amazon S3, estará listo para almacenar su primer objeto de datos en S3. Los objetos en S3 se almacenan en contenedores, llamados "buckets" (cubos). Los nombres de los buckets son únicos en S3, y cada usuario puede tener como máximo 100 buckets simultáneamente. Cada bucket puede contener una cantidad ilimitada de objetos, identificados por nombre.
El siguiente ejemplo muestra cómo crear un bucket, y cómo almacenar y recuperar los datos.
Ejemplo 64.63. Ejemplo de uso de Zend_Service_Amazon_S3
require_once 'Zend/Service/Amazon/S3.php';
$s3 = new Zend_Service_Amazon_S3($my_aws_key, $my_aws_secret_key);
$s3->createBucket("my-own-bucket");
$s3->putObject("my-own-bucket/myobject", "somedata");
echo $s3->getObject("my-own-bucket/myobject");
Dado que el servicio Zend_Service_Amazon_S3 requiere autenticación,
debe pasar sus credenciales (clave de AWS y clave secreta) al constructor.
Si solo utiliza una cuenta, puede establecer credenciales predeterminadas para el servicio:
require_once 'Zend/Service/Amazon/S3.php'; Zend_Service_Amazon_S3::setKeys($my_aws_key, $my_aws_secret_key); $s3 = new Zend_Service_Amazon_S3();
Todos los objetos en el sistema S3 se almacenan en buckets. Es necesario crear un bucket antes de realizar cualquier operación de almacenamiento. El nombre del bucket es único en el sistema, por lo que no puede tener un bucket con el mismo nombre que el de otra persona.
El nombre del bucket puede contener letras minúsculas, dígitos, puntos (.), guiones bajos (_) y guiones (-). No se permiten otros símbolos. El nombre del bucket debe comenzar con una letra o dígito, y tener entre 3 y 255 caracteres de longitud. No se permiten nombres con aspecto de dirección IP (por ejemplo, "192.168.16.255").
createBucket()crea un nuevo bucket.cleanBucket()elimina todos los objetos contenidos en un bucket.-
removeBucket()elimina el bucket del sistema. El bucket debe estar vacío para poder eliminarlo.Ejemplo 64.64. Ejemplo de eliminación de un bucket con Zend_Service_Amazon_S3
require_once 'Zend/Service/Amazon/S3.php'; $s3 = new Zend_Service_Amazon_S3($my_aws_key, $my_aws_secret_key); $s3->cleanBucket("my-own-bucket"); $s3->removeBucket("my-own-bucket");
-
getBuckets()devuelve la lista de los nombres de todos los buckets pertenecientes al usuario.Ejemplo 64.65. Ejemplo de listado de buckets con Zend_Service_Amazon_S3
require_once 'Zend/Service/Amazon/S3.php'; $s3 = new Zend_Service_Amazon_S3($my_aws_key, $my_aws_secret_key); $list = $s3->getBuckets(); foreach($list as $bucket) { echo "I have bucket $bucket\n"; }
isBucketAvailable()comprueba si el bucket existe y devuelveTRUEsi es así.
El objeto es la unidad básica de almacenamiento en S3. Un objeto almacena datos no estructurados, que pueden ser de cualquier tamaño hasta 4 gigabytes. No hay límite en cuanto a cuántos objetos pueden almacenarse en el sistema.
Los objetos están contenidos en buckets. Un objeto se identifica por su nombre, que
puede ser cualquier cadena utf-8. Es habitual utilizar nombres jerárquicos (como
Pictures/Myself/CodingInPHP.jpg) para organizar los nombres de los
objetos. El nombre del objeto se antepone con el nombre del bucket al usar las funciones
de objetos, de modo que para el objeto "mydata" en el bucket "my-own-bucket", el nombre
sería my-own-bucket/mydata.
Los objetos pueden reemplazarse (reescribiendo nuevos datos con la misma clave) o eliminarse, pero no modificarse, ampliarse, etc. El objeto siempre se almacena completo.
Por defecto, todos los objetos son privados y solo pueden ser accedidos por su
propietario. Sin embargo, es posible especificar el objeto con acceso público, en cuyo
caso estará disponible a través de la URL:
http://s3.amazonaws.com/[bucket-name]/[object-name].
-
putObject($object, $data, $meta)crea un objeto con nombre$object(debe contener el nombre del bucket como prefijo) con$datacomo contenido.El parámetro opcional
$metaes el array de metadatos, que actualmente admite los siguientes parámetros como claves:S3_CONTENT_TYPE_HEADERTipo de contenido MIME de los datos. Si no se especifica, el tipo se deducirá según la extensión del archivo del nombre del objeto.
S3_ACL_HEADER-
El acceso al elemento. Se pueden utilizar las siguientes constantes de acceso:
S3_ACL_PRIVATESolo el propietario tiene acceso al elemento.
S3_ACL_PUBLIC_READCualquiera puede leer el objeto, pero solo el propietario puede escribir. Este ajuste puede utilizarse para almacenar contenido de acceso público.
S3_ACL_PUBLIC_WRITECualquiera puede leer o escribir el objeto. Esta política es raramente útil.
S3_ACL_AUTH_READSolo el propietario tiene acceso de escritura al elemento, y otros usuarios autenticados de S3 tienen acceso de lectura. Esto es útil para compartir datos entre cuentas de S3 sin exponerlos al público.
Por defecto, todos los elementos son privados.
Ejemplo 64.66. Ejemplo de objeto público con Zend_Service_Amazon_S3
require_once 'Zend/Service/Amazon/S3.php'; $s3 = new Zend_Service_Amazon_S3($my_aws_key, $my_aws_secret_key); $s3->putObject("my-own-bucket/Pictures/Me.png", file_get_contents("me.png"), array(Zend_Service_Amazon_S3::S3_ACL_HEADER => Zend_Service_Amazon_S3::S3_ACL_PUBLIC_READ)); // or: $s3->putFile("me.png", "my-own-bucket/Pictures/Me.png", array(Zend_Service_Amazon_S3::S3_ACL_HEADER => Zend_Service_Amazon_S3::S3_ACL_PUBLIC_READ)); echo "Go to http://s3.amazonaws.com/my-own-bucket/Pictures/Me.png to see me!\n";
getObject($object)recupera los datos del objeto desde el almacenamiento por nombre.removeObject($object)elimina el objeto del almacenamiento.-
getInfo($object)recupera la información de metadatos sobre el objeto. La función devolverá un array con la información de metadatos. Algunas de las claves útiles son:typeEl tipo MIME del elemento.
sizeEl tamaño de los datos del objeto.
mtimeMarca de tiempo tipo UNIX de la última modificación del objeto.
etagEl ETag de los datos, que es el hash MD5 de los datos, rodeado de comillas (").
La función devolverá
FALSEsi la clave no corresponde a ningún objeto existente. -
getObjectsByBucket($bucket)devuelve la lista de las claves de objeto contenidas en el bucket.Ejemplo 64.67. Ejemplo de listado de objetos con Zend_Service_Amazon_S3
require_once 'Zend/Service/Amazon/S3.php'; $s3 = new Zend_Service_Amazon_S3($my_aws_key, $my_aws_secret_key); $list = $s3->getObjectsByBucket("my-own-bucket"); foreach($list as $name) { echo "I have $name key:\n"; $data = $s3->getObject("my-own-bucket/$name"); echo "with data: $data\n"; }
isObjectAvailable($object)comprueba si el objeto con el nombre dado existe.-
putFile($path, $object, $meta)coloca el contenido del archivo en$pathen el objeto llamado$object.El argumento opcional
$metaes el mismo que paraputObject. Si se omite el tipo de contenido, se deducirá basándose en el nombre del archivo de origen.
Es posible obtener y colocar objetos usando no datos de flujo mantenidos en memoria, sino archivos o flujos PHP. Esto es especialmente útil cuando los tamaños de archivo son grandes, para no sobrepasar los límites de memoria.
Para recibir un objeto usando transmisión, utilice el método
getObjectStream($object, $filename). Este método devolverá
Zend_Http_Response_Stream, que puede utilizarse tal como se describe en
la sección Transmisión de datos del cliente HTTP.
Ejemplo 64.68. Ejemplo de transmisión de datos con Zend_Service_Amazon_S3
$response = $amazon->getObjectStream("mybycket/zftest");
// copy file
copy($response->getStreamName(), "my/downloads/file");
// use stream
$fp = fopen("my/downloads/file2", "w");
stream_copy_to_stream($response->getStream(), $fp);
El segundo parámetro de getObjectStream() es opcional y
especifica el archivo destino en el que escribir los datos. Si no se especifica, se
utiliza un archivo temporal, que se eliminará después de que se destruya el objeto de respuesta.
Para enviar un objeto usando transmisión, utilice putFileStream(), que tiene
la misma firma que putFile() pero utilizará transmisión y no
leerá el archivo en memoria.
Además, puede pasar un recurso de flujo al parámetro de datos del método
putObject(), en cuyo caso los datos se leerán del flujo al enviar
la petición al servidor.
Además de las interfaces descritas anteriormente,
Zend_Service_Amazon_S3 también admite funcionar como un envoltorio
de flujo. Para ello, necesita registrar el objeto cliente como el envoltorio de flujo:
Ejemplo 64.69. Ejemplo de flujos con Zend_Service_Amazon_S3
require_once 'Zend/Service/Amazon/S3.php';
$s3 = new Zend_Service_Amazon_S3($my_aws_key, $my_aws_secret_key);
$s3->registerStreamWrapper("s3");
mkdir("s3://my-own-bucket");
file_put_contents("s3://my-own-bucket/testdata", "mydata");
echo file_get_contents("s3://my-own-bucket/testdata");
Las operaciones de directorio (mkdir, rmdir, opendir,
etc.) operarán sobre buckets, por lo que sus argumentos deben tener la forma de
s3://bucketname. Las operaciones de archivo operan sobre objetos. Se admite la
creación, lectura, escritura, eliminación, obtención de estadísticas y listado de directorios de objetos.