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 PHP fonctions intégréesfile_get_contents
, telles que fopen
copy
,rename
,, unlink
mkdir
, 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 en file_put_contents
raison de la manière dont elles sont PHP implémentées.
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
$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 permettre le rappel des 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 HTTP protocole n'autorise 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 lors d'une PutObject
opération sont mises en mémoire tampon interne à l'aide d'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 en file_put_contents
raison de la manière dont elles sont PHP implémentées.
modes fopen
PHPLa fonction fopen ()$mode
option. 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. |
x |
Un flux en écriture seule. Une erreur est générée si l'objet existe déjà. |
Autres fonctions de l'objet
Les streamwrappers permettent à de nombreuses PHP fonctions 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.
Vous pouvez transmettre toutes les options disponibles pour l'opération
|
filesize() |
Pour obtenir la taille d'un objet.
|
is_file() |
Vérifie s'il s'URLagit d'un fichier.
|
file_exists() |
Pour vérifier si un objet existe.
|
filetype() |
Vérifie si un URL objet correspond à 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 |
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 |
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 dans. 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 pouvez créer et parcourir des répertoires sur votre système de fichiers.
Voici un exemple de création d'un bucket.
mkdir('s3://amzn-s3-demo-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 fonctionnement StreamWrapper
de la mkdir
fonction avec les autorisations etACLs. Plus d'informations sont disponibles dans cet AWS article 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://amzn-s3-demo-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://amzn-s3-demo-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é « amzn-s3-demo-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://amzn-s3-demo-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
Utilisez cette rmdir()
fonction pour supprimer un objet de dossier vide, comme indiqué dans l'extrait suivant.
rmdir('s3://amzn-s3-demo-bucket/my-folder')
Répertorier le contenu d'un bucket
Vous pouvez utiliser les fonctions opendir ()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 compartiment à l'aide PHP de RecursiveDirectoryIterator
$dir = 's3://bucket'; $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir)); foreach ($iterator as $file) { echo $file->getType() . ': ' . $file . "\n"; }
Une autre méthode pour répertorier le contenu d'un compartiment de manière récursive qui entraîne le moins de HTTP requêtes consiste à utiliser la Aws\recursive_dir_iterator($path, $context = null)
fonction.
<?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, le stream wrapper utilise un cache en mémoireLRU.