Enveloppeur de flux Amazon S3 avec AWS SDK for PHP version 3 - AWS SDK for PHP

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Enveloppeur de flux Amazon S3 avec AWS SDK for PHP version 3

Le wrapper de flux Amazon S3 vous permet de stocker et de récupérer des données depuis Amazon S3 à l'aide de fonctions PHP intégréesfile_get_contents, telles que fopencopy,rename,, unlinkmkdir, etrmdir.

Vous devez enregistrer le wrapper de flux Amazon S3 pour l'utiliser.

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

Cela vous permet d'accéder aux compartiments et aux objets stockés dans Amazon S3 à l'aide du s3:// protocole. L'encapsuleur de flux Amazon S3 accepte les chaînes contenant un nom de compartiment suivi d'une barre oblique et d'une clé d'objet ou d'un préfixe facultatif :. s3://<bucket>[/<key-or-prefix>]

Note

L'encapsuleur de flux est conçu pour fonctionner avec les objets et les compartiments sur lesquels vous avez au moins une autorisation de lecture. Cela signifie que votre utilisateur doit avoir l'autorisation d'exécuter ListBucket sur les compartiments et GetObject sur les objets avec lesquels l'utilisateur doit interagir. Pour les cas d'utilisation où vous ne disposez pas de ce niveau d'autorisation, nous vous recommandons d'utiliser directement les opérations client Amazon S3.

Télécharger les données

Vous pouvez saisir le contenu d'un objet en utilisant file_get_contents. Cependant, soyez prudent avec cette fonction, car elle charge tout le contenu de l'objet dans la mémoire.

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

fopen()À utiliser lorsque vous travaillez avec des fichiers plus volumineux ou si vous devez diffuser des données depuis 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); }
Note

Des erreurs d'écriture du fichier sont renvoyées uniquement lorsqu'un appel à fflush est effectué. Ces erreurs ne sont pas renvoyées lorsqu'un appel à fclose non vidé est effectué. La valeur de retour pour fclose sera de true s'il ferme le flux, quel que soit le nombre d'erreurs en réponse à son fflush interne. Ces erreurs ne sont pas non plus renvoyées lors de l'appel à file_put_contents, à cause de la façon dont PHP l'implémente.

Streams consultables ouverts

Les flux ouverts en mode « r » autorisent uniquement la lecture de données depuis le flux, et ne peuvent pas être recherchés par défaut. Cela permet de télécharger les données depuis Amazon S3 de manière véritablement en streaming, les octets précédemment lus n'ayant pas besoin d'être mis en mémoire tampon. Si vous avez besoin qu’un flux puisse être recherché, vous pouvez transférer seekable dans les options de contexte de flux d’une fonction.

$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); }

Ouvrir des flux pouvant être recherchés vous permet de rechercher des octets qui ont été lus auparavant. Vous ne pouvez pas passer directement aux octets qui n'ont pas encore été lus depuis le serveur distant. Pour autoriser le rappel de données précédemment lues, les données sont mises en mémoire tampon dans un flux PHP temporaire à l'aide d'un décorateur de flux. Lorsque la quantité de données mises en cache dépasse 2 Mo, les données dans le flux temporaire sont transférées de la mémoire au disque. Gardez cela à l'esprit lorsque vous téléchargez des fichiers volumineux depuis Amazon S3 à l'aide du paramètre de contexte de seekable flux.

Charger des données

Vous pouvez télécharger des données sur Amazon S3 à l'aide defile_put_contents().

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

Vous pouvez télécharger des fichiers plus volumineux en diffusant les données en streaming à l'aide de fopen() et d'un mode d'accès du flux « w », « x » ou « a ». L'encapsuleur de flux Amazon S3 ne prend pas en charge les flux de lecture et d'écriture simultanés (par exemple « r+ », « w+ », etc.). Cela est dû au fait que le protocole HTTP ne permet pas la lecture et l'écriture simultanées.

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

Amazon S3 exige qu'un en-tête Content-Length soit spécifié avant que la charge utile d'une demande ne soit envoyée. Par conséquent, les données à télécharger dans une opération PutObject sont mises en mémoire tampon grâce à un flux PHP temporaire jusqu'à ce que le flux soit vidé ou fermé.

Note

Des erreurs d'écriture du fichier sont renvoyées uniquement lorsqu'un appel à fflush est effectué. Ces erreurs ne sont pas renvoyées lorsqu'un appel à fclose non vidé est effectué. La valeur de retour pour fclose sera de true s'il ferme le flux, quel que soit le nombre d'erreurs en réponse à son fflush interne. Ces erreurs ne sont pas non plus renvoyées lors de l'appel à file_put_contents, à cause de la façon dont PHP l'implémente.

modes fopen

La fonction PHP fopen() nécessite que vous indiquiez une option $mode. L'option de mode spécifie si les données peuvent être lues ou écrites dans un flux, et si le fichier doit exister lors de l'ouverture d'un flux.

Le wrapper de flux Amazon S3 prend en charge les modes suivants pour les flux qui ciblent des objets Amazon S3.

r

Un flux en lecture seule où l'objet doit déjà exister.

w

Un flux en écriture seule. Si l'objet existe déjà, il est remplacé.

a

Un flux en écriture seule. Si l'objet existe déjà, il est téléchargé dans un flux temporaire et toutes les écritures dans le flux sont ajoutées aux données précédemment téléchargées.

h/24, j/7

Un flux en écriture seule. Une erreur est générée si l'objet existe déjà.

Autres fonctions de l'objet

Les wrappers de flux permettent à de nombreuses fonctions PHP intégrées de fonctionner avec un système personnalisé tel qu'Amazon S3. Voici quelques-unes des fonctions que le wrapper de flux Amazon S3 vous permet d'exécuter avec des objets stockés dans Amazon S3.

unlink()

Pour supprimer un objet dans un compartiment.

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

Vous pouvez transmettre toutes les options disponibles pour l'opération DeleteObject afin de modifier la façon dont l'objet est supprimé (par exemple, en spécifiant une version d'objet spécifique).

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

filesize()

Pour obtenir la taille d'un objet.

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

is_file()

Pour vérifier si une URL est un fichier.

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

file_exists()

Pour vérifier si un objet existe.

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

filetype()

Vérifie si une URL est mappée à un fichier ou un compartiment (dir).

dans le fichier()

Pour charger le contenu d'un objet dans un tableau de lignes. Vous pouvez transmettre toute option disponible à l'opération GetObject pour modifier la façon dont le fichier est téléchargé.

filemtime()

Pour obtenir la date à laquelle l'objet a été modifié pour la dernière fois.

rename()

Pour renommer un objet en le copiant puis en supprimant l'original. Vous pouvez transmettre les options disponibles pour les opérations CopyObject et DeleteObject aux paramètres de contexte de flux pour modifier la façon dont l'objet est copié et supprimé.

Note

Bien qu'il fonctionne copy généralement avec le wrapper de flux Amazon S3, certaines erreurs peuvent ne pas être correctement signalées en raison des éléments internes de la copy fonction en PHP. Nous vous recommandons d'utiliser une instance d'AWSs3 à la place ObjectCopier.

Travaillez avec des compartiments et des dossiers

Utilisable mkdir() pour travailler avec des seaux

Vous pouvez créer et parcourir des compartiments Amazon S3 de la même manière que PHP vous permet de créer et de parcourir des répertoires sur votre système de fichiers.

Voici un exemple de création d'un bucket.

mkdir('s3://my-bucket');
Note

En avril 2023, Amazon S3 a automatiquement activé S3 Block Public Access et désactivé les listes de contrôle d'accès pour tous les buckets nouvellement créés. Cette modification affecte également le mkdir fonctionnement StreamWrapper de la fonction avec les autorisations et les ACL. Plus d'informations sont disponibles dans cet AWSarticle Quoi de neuf ?

Vous pouvez transmettre des options de contexte de flux à la mkdir() méthode pour modifier la façon dont le bucket est créé à l'aide des paramètres disponibles pour l'CreateBucketopération.

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

Vous pouvez supprimer des compartiments à l'aide de la fonction rmdir().

// Delete a bucket rmdir('s3://my-bucket);
Note

Un compartiment ne peut être supprimé que s'il est vide.

mkdir()À utiliser pour travailler avec des dossiers

Après avoir créé un bucket, vous pouvez l'utiliser mkdir() pour créer des objets qui fonctionnent comme des dossiers, comme dans un système de fichiers.

L'extrait de code suivant ajoute un objet de dossier nommé « my-folder » au bucket existant nommé « my-bucket ». Utilisez la barre oblique (/) pour séparer le nom d'un objet de dossier du nom du compartiment et de tout autre nom de dossier supplémentaire.

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

La remarque précédente concernant les modifications d'autorisation après avril 2023 entre également en ligne de compte lorsque vous créez des objets de dossier. Ce billet de blog contient des informations sur la façon d'ajuster les autorisations si nécessaire.

Utilisez cette rmdir() fonction pour supprimer un objet de dossier vide, comme indiqué dans l'extrait suivant.

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

Répertorier le contenu d'un bucket

Vous pouvez utiliser les fonctions PHP opendir (), readdir (), rewinddir () et closedir () avec le wrapper de flux Amazon S3 pour parcourir le contenu d'un bucket. Vous pouvez transmettre les paramètres disponibles pour l'ListObjectsopération sous forme d'options contextuelles de flux personnalisées à la opendir() fonction afin de modifier la façon dont les objets sont répertoriés.

$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); }

Vous pouvez répertorier de manière récursive chaque objet et chaque préfixe d'un bucket à l'aide de PHP. RecursiveDirectoryIterator

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

Une autre façon de répertorier de façon récursive les contenus d'un compartiment, qui entraîne moins de requêtes HTTP, est d'utiliser la fonction 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"; }

Options de contexte de diffusion

Vous pouvez personnaliser le client utilisé par l'encapsuleur de flux, ou le cache utilisé pour mettre en cache les informations précédemment chargées sur les compartiments et les clés, en transmettant les options de contexte de flux personnalisé.

L'encapsuleur de flux prend en charge les options de contexte de flux suivantes au niveau de chaque opération.

client

L'objet Aws\AwsClientInterface à utiliser pour exécuter des commandes.

cache

Une instance de Aws\CacheInterface à utiliser pour mettre en cache les statistiques des fichiers précédemment obtenues. Par défaut, l'encapsuleur de flux utilise un cache LRU en mémoire.