Contenedor de transmisiones Amazon S3 con AWS SDK for PHP versión 3 - AWS SDK for PHP

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Contenedor de transmisiones Amazon S3 con AWS SDK for PHP versión 3

El contenedor de transmisiones de Amazon S3 le permite almacenar y recuperar datos de Amazon S3 mediante PHP funciones integradas, como file_get_contentsfopen,copy,rename, unlinkmkdir, yrmdir.

Debe registrar el encapsulador de flujo de Amazon S3 para utilizarlo.

$client = new Aws\S3\S3Client([/** options **/]); // Register the stream wrapper from an S3Client object $client->registerStreamWrapper();

De este modo, puede acceder a los buckets y objetos almacenados en Amazon S3 utilizando el protocolo s3://. El encapsulador de flujo de Amazon S3 acepta cadenas que contienen un nombre de bucket, seguido de una barra inclinada y una clave de objeto opcional o el prefijo: s3://<bucket>[/<key-or-prefix>].

nota

El encapsulador de flujo se ha diseñado para trabajar con objetos y buckets en los que tenga al menos permiso de lectura. Esto significa que su usuario debe tener permiso para ejecutar ListBucket en cualquier bucket y GetObject en cualquier objeto con el que el usuario necesita interactuar. Por lo tanto, para los casos de uso en los que no tiene este nivel de permiso, le recomendamos que utilice las operaciones de cliente de Amazon S3 directamente.

Descargar datos

Puede tomar el contenido de un objeto utilizando file_get_contents. Sin embargo, tenga cuidado con esta función pues carga todo el contenido del objeto en la memoria.

// Download the body of the "key" object in the "bucket" bucket $data = file_get_contents('s3://bucket/key');

Utilice fopen() cuando trabaje con archivos grandes o si necesita transmitir datos desde Amazon S3.

// Open a stream in read-only mode if ($stream = fopen('s3://bucket/key', 'r')) { // While the stream is still open while (!feof($stream)) { // Read 1,024 bytes from the stream echo fread($stream, 1024); } // Be sure to close the stream resource when you're done with it fclose($stream); }
nota

Los errores de escritura de archivos solo se devuelven cuando se llama a fflush. Esos errores no se devuelven cuando se llama a un fclose sin vaciar. El valor de retorno de fclose será true si cierra el flujo, sin importar si hay errores en respuesta a su fflush interno. Estos errores tampoco se devuelven cuando se llama file_put_contents debido a la forma en que se PHP implementan.

Abrir flujos rastreables

Los flujos abiertos en modo "r" solo admiten datos que se pueden leer desde el flujo y no se pueden rastrear de forma predeterminada. Esto es así para que los datos se puedan descargar desde Amazon S3 mediante flujos reales, donde los bytes leídos previamente no tengan que almacenarse en la memoria del búfer. Si necesita poder rastrear un flujo, puede transferir seekable a las opciones de contexto del flujo de una función.

$context = stream_context_create([ 's3' => ['seekable' => true] ]); if ($stream = fopen('s3://bucket/key', 'r', false, $context)) { // Read bytes from the stream fread($stream, 1024); // Seek back to the beginning of the stream fseek($stream, 0); // Read the same bytes that were previously read fread($stream, 1024); fclose($stream); }

La apertura de flujos rastreables le permite buscar bytes leídos previamente. No se puede pasar directamente a bytes que todavía no se han leído desde el servidor remoto. Para permitir recuperar los datos leídos anteriormente, los datos se almacenan en un flujo PHP temporal utilizando un decorador de flujo. Cuando la cantidad de datos almacenados en la memoria caché supera los 2 MB, los datos del flujo temporal se transfieren de la memoria al disco. Tenga en mente esta posibilidad al descargar archivos grandes desde Amazon S3 utilizando la opción de contexto del flujo de seekable.

Cargar datos

Puede cargar datos a Amazon S3 mediante file_put_contents().

file_put_contents('s3://bucket/key', 'Hello!');

Puede cargar archivos de mayor tamaño realizando un streaming de los datos utilizando fopen() y un modo de acceso de flujo "w", "x" o "a". El encapsulador de flujo de Amazon S3 no permite leer y escribir flujos de forma simultánea (por ejemplo, "r+", "w+", etc.). Esto se debe a que el HTTP protocolo no permite la lectura y la escritura simultáneas.

$stream = fopen('s3://bucket/key', 'w'); fwrite($stream, 'Hello!'); fclose($stream);
nota

Amazon S3 requiere que se especifique un encabezado de longitud del contenido antes de que se envíe la carga de una solicitud. Por lo tanto, los datos que se van a cargar en una PutObject operación se almacenan internamente mediante un flujo PHP temporal hasta que el flujo se vacía o se cierra.

nota

Los errores de escritura de archivos solo se devuelven cuando se llama a fflush. Esos errores no se devuelven cuando se llama a un fclose sin vaciar. El valor de retorno de fclose será true si cierra el flujo, sin importar si hay errores en respuesta a su fflush interno. Estos errores tampoco se devuelven cuando se llama file_put_contents debido a la forma en que se implementan. PHP

Modos fopen

PHPLa función fopen () requiere que especifiques una $mode opción. La opción de modo especifica si se pueden leer o escribir datos en un flujo y si el archivo debe existir al abrir un flujo.

El encapsulador de flujos de Amazon S3 admite los siguientes modos para los flujos que se dirigen a objetos de Amazon S3.

r

Es un flujo de solo lectura donde el objeto ya debe existir.

w

Es un flujo de solo escritura. Si el objeto ya existe, se sobrescribe.

a

Es un flujo de solo escritura. Si el objeto ya existe, se descarga en un flujo temporal y cualquier escritura en el flujo se agrega a cualquier dato cargado previamente.

x

Es un flujo de solo escritura. Aparece un error si el objeto no existe todavía.

Otras funciones de objeto

Los streamwrappers permiten que muchas PHP funciones integradas diferentes funcionen con un sistema personalizado como Amazon S3. Estas son algunas de las funciones que el encapsulador de flujo de Amazon S3 le permite realizar con objetos almacenados en Amazon S3.

unlink()

Elimina un objeto de un bucket.

// Delete an object from a bucket unlink('s3://bucket/key');

Puede transferir cualquiera de las opciones disponibles a la operación DeleteObject para modificar la forma en que se elimina el objeto (por ejemplo, especificando una versión del objeto determinada).

// Delete a specific version of an object from a bucket unlink('s3://bucket/key', stream_context_create([ 's3' => ['VersionId' => '123'] ]);

filesize()

Obtiene el tamaño de un objeto.

// Get the Content-Length of an object $size = filesize('s3://bucket/key', );

is_file()

Comprueba si a URL es un archivo.

if (is_file('s3://bucket/key')) { echo 'It is a file!'; }

file_exists()

Comprueba si existe un objeto.

if (file_exists('s3://bucket/key')) { echo 'It exists!'; }

filetype()

Comprueba si a se URL asigna a un archivo o a un depósito (dir).

file()

Carga el contenido de un objeto en una matriz de líneas. Puede transferir cualquiera de las opciones disponibles a la operación GetObject para modificar la forma en que se descarga el archivo.

filemtime()

Obtiene la última fecha de modificación de un objeto.

rename()

Para cambiar el nombre de un objeto copiándolo y eliminando el original. Puede transferir las opciones disponibles de las operaciones CopyObject y DeleteObject a los parámetros de contexto del flujo para modificar la forma en que se copia y elimina el objeto.

nota

Aunque copy normalmente funciona con el contenedor de transmisiones Amazon S3, es posible que algunos errores no se notifiquen correctamente debido a las funciones internas de la copy función. PHP En su lugar, le recomendamos que utilice una instancia de ObjectCopierAWSS3.

Trabajar con buckets y carpetas

Utilizar mkdir() para trabajar con buckets

Puede crear y explorar buckets de Amazon S3 de forma similar a como PHP lo hace para crear y recorrer directorios en su sistema de archivos.

A continuación se incluye un ejemplo de creación de un bucket.

mkdir('s3://amzn-s3-demo-bucket');
nota

En abril de 2023, Amazon S3 habilitó automáticamente el bloqueo de acceso público de S3 y desactivó las listas de control de acceso para todos los buckets creados recientemente. Este cambio también afecta al funcionamiento StreamWrapper de la mkdir función con los permisos y. ACLs Encontrará más información en este AWS artículo sobre las novedades.

Puede pasar las opciones del contexto del flujo al mkdir() método para modificar la forma en que se crea el depósito utilizando los parámetros disponibles para la CreateBucketoperación.

// Create a bucket in the EU (Ireland) Region mkdir('s3://amzn-s3-demo-bucket', 0500, true, stream_context_create([ 's3' => ['LocationConstraint' => 'eu-west-1'] ]));

Puede eliminar buckets utilizando la función rmdir().

// Delete a bucket rmdir('s3://amzn-s3-demo-bucket);
nota

Los buckets solo se pueden eliminar si están vacíos.

Utilizar mkdir() para trabajar con carpetas

Después de crear un bucket, puede utilizar mkdir() para crear objetos que funcionen como carpetas, tal y como ocurre en un sistema de archivos.

El siguiente fragmento de código añade un objeto de carpeta denominado «my-folder» al depósito existente denominado «amzn-s3-demo-bucket». Utilice la barra inclinada (/) para separar el nombre de un objeto de carpeta del nombre del depósito y de cualquier nombre de carpeta adicional.

mkdir('s3://amzn-s3-demo-bucket/my-folder')

La nota anterior sobre los cambios de permisos después de abril de 2023 también se aplica al crear objetos de carpeta. Esta entrada de blog contiene información sobre cómo ajustar los permisos si es necesario.

Utilice la función rmdir() para eliminar un objeto de carpeta vacío tal y como se muestra en el siguiente fragmento.

rmdir('s3://amzn-s3-demo-bucket/my-folder')

Mostrar el contenido de un bucket

Puede usar las funciones opendir (), readdir (), rewinddir () y closedir () con PHP el contenedor de transmisiones Amazon S3 para recorrer el contenido de un bucket. Puede pasar los parámetros disponibles para la ListObjectsoperación como opciones de contexto de transmisión personalizadas a la opendir() función para modificar la forma en que se muestran los objetos.

$dir = "s3://bucket/"; if (is_dir($dir) && ($dh = opendir($dir))) { while (($file = readdir($dh)) !== false) { echo "filename: {$file} : filetype: " . filetype($dir . $file) . "\n"; } closedir($dh); }

Puede enumerar de forma recursiva cada objeto y prefijo de un grupo utilizando PHP's. RecursiveDirectoryIterator

$dir = 's3://bucket'; $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir)); foreach ($iterator as $file) { echo $file->getType() . ': ' . $file . "\n"; }

Otra forma de enumerar el contenido de un depósito de forma recursiva que reciba menos HTTP solicitudes es utilizar la función. Aws\recursive_dir_iterator($path, $context = null)

<?php require 'vendor/autoload.php'; $iter = Aws\recursive_dir_iterator('s3://bucket/key'); foreach ($iter as $filename) { echo $filename . "\n"; }

Opciones de contexto del flujo

Puede personalizar el cliente utilizado por el encapsulador de flujo o la caché utilizada para grabar en caché la información cargada previamente acerca de buckets y claves, transfiriendo las opciones de contexto del flujo personalizadas.

El encapsulador de flujo es compatible con las siguientes opciones de contexto del flujo en cada operación.

client

Es el objeto Aws\AwsClientInterface que se va a utilizar para ejecutar comandos.

cache

Es una instancia de Aws\CacheInterface que se va a utilizar para almacenar en caché las estadísticas de archivos obtenidas previamente. De forma predeterminada, el contenedor de flujos usa una caché en memoria. LRU