TigerZF
🌐Español

64.15. Zend_Service_Amazon_S3

64.15.1. Introducción

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.

64.15.2. Registro en Amazon S3

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.

64.15.3. Documentación de la API

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.

64.15.4. Características

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.

64.15.5. Primeros pasos

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();

64.15.6. Operaciones con buckets

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 devuelve TRUE si es así.

64.15.7. Operaciones con objetos

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 $data como contenido.

    El parámetro opcional $meta es el array de metadatos, que actualmente admite los siguientes parámetros como claves:

    S3_CONTENT_TYPE_HEADER

    Tipo 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_PRIVATE

    Solo el propietario tiene acceso al elemento.

    S3_ACL_PUBLIC_READ

    Cualquiera puede leer el objeto, pero solo el propietario puede escribir. Este ajuste puede utilizarse para almacenar contenido de acceso público.

    S3_ACL_PUBLIC_WRITE

    Cualquiera puede leer o escribir el objeto. Esta política es raramente útil.

    S3_ACL_AUTH_READ

    Solo 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:

    type

    El tipo MIME del elemento.

    size

    El tamaño de los datos del objeto.

    mtime

    Marca de tiempo tipo UNIX de la última modificación del objeto.

    etag

    El ETag de los datos, que es el hash MD5 de los datos, rodeado de comillas (").

    La función devolverá FALSE si 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 $path en el objeto llamado $object.

    El argumento opcional $meta es el mismo que para putObject. Si se omite el tipo de contenido, se deducirá basándose en el nombre del archivo de origen.

64.15.8. Transmisión de datos

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.

64.15.9. Envoltorio de flujo

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.