Utilisation des téléchargements partitionnés sur Amazon S3 avec AWS SDK for PHP la 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.

Utilisation des téléchargements partitionnés sur Amazon S3 avec AWS SDK for PHP la version 3

Vous pouvez charger des objets de taille inférieure ou égale à 5 Go à l'aide d'une simple opération PutObject. Cependant, les méthodes de chargement partitionné (par exemple, CreateMultipartUpload, UploadPart, CompleteMultipartUpload et AbortMultipartUpload) vous permettent de charger des objets dont la taille est comprise entre 5 Mo et 5 To.

L’exemple suivant indique comment :

  • Chargez un objet sur Amazon S3 à l'aide de ObjectUploader.

  • Créez un téléchargement partitionné pour un objet Amazon S3 à l'aide MultipartUploaderde.

  • Copiez des objets d'un emplacement Amazon S3 à un autre à l'aide de ObjectCopier.

Tous les exemples de code pour le AWS SDK for PHP sont disponibles ici GitHub.

Informations d’identification

Avant d'exécuter l'exemple de code, configurez vos AWS informations d'identification, comme décrit dansInformations d'identification. Importez ensuite le AWS SDK for PHP, comme décrit dansUtilisation de base.

Uploader des objets

Si vous n'êtes pas sûr de la solution la mieux adaptée à la tâche, utilisezObjectUploader. PutObject MultipartUploader ObjectUploadertélécharge un fichier volumineux sur Amazon S3 en utilisant l'une PutObject ou l'autre des MultipartUploader méthodes les plus adaptées en fonction de la taille de la charge utile.

require 'vendor/autoload.php'; use Aws\Exception\MultipartUploadException; use Aws\S3\MultipartUploader; use Aws\S3\ObjectUploader; use Aws\S3\S3Client;

Exemple de code

// Create an S3Client. $s3Client = new S3Client([ 'profile' => 'default', 'region' => 'us-east-2', 'version' => '2006-03-01' ]); $bucket = 'your-bucket'; $key = 'my-file.zip'; // Use a stream instead of a file path. $source = fopen('/path/to/large/file.zip', 'rb'); $uploader = new ObjectUploader( $s3Client, $bucket, $key, $source ); do { try { $result = $uploader->upload(); if ($result["@metadata"]["statusCode"] == '200') { print('<p>File successfully uploaded to ' . $result["ObjectURL"] . '.</p>'); } print($result); // If the SDK chooses a multipart upload, try again if there is an exception. // Unlike PutObject calls, multipart upload calls are not automatically retried. } catch (MultipartUploadException $e) { rewind($source); $uploader = new MultipartUploader($s3Client, $source, [ 'state' => $e->getState(), ]); } } while (!isset($result)); fclose($source);

Configuration

Le constructeur de l'objet ObjectUploader accepte les arguments suivants :

$client

L'objet Aws\ClientInterface à utiliser pour effectuer les transferts. Il doit s'agir d'une instance de Aws\S3\S3Client.

$bucket

(string, obligatoire) Nom du compartiment vers lequel l’objet est chargé.

$key

(string, obligatoire) Clé à utiliser pour l’objet concerné par le chargement.

$body

(mixed, obligatoire) Données d'objet à télécharger. Il peut s'agir StreamInterface d'une ressource de PHP flux ou d'une chaîne de données à télécharger.

$acl

(string) Liste de contrôle d'accès (ACL) à définir sur l'objet en cours de téléchargement. Les objets sont privés par défaut.

$options

Un tableau associatif d'options de configuration pour le chargement partitionné. Les options de configuration suivantes sont valides :

add_content_md5

(bool) Réglez sur true pour calculer automatiquement la MD5 somme de contrôle pour le téléchargement.

mup_threshold

(int, par défaut :int(16777216)) Le nombre d'octets correspondant à la taille du fichier. Si la taille du fichier dépasse cette limite, un téléchargement partitionné est utilisé.

before_complete

(callable) Rappel à invoquer avant l'opération CompleteMultipartUpload. Le rappel doit avoir une signature de fonction similaire à :function (Aws\Command $command) {...}. Consultez la CompleteMultipartUpload APIréférence pour les paramètres que vous pouvez ajouter à l'CommandInterfaceobjet.

before_initiate

(callable) Rappel à invoquer avant l'opération CreateMultipartUpload. Le rappel doit avoir une signature de fonction similaire à :function (Aws\Command $command) {...}. SDKInvoque ce rappel si la taille du fichier dépasse la mup_threshold valeur. Consultez la CreateMultipartUpload APIréférence pour les paramètres que vous pouvez ajouter à l'CommandInterfaceobjet.

before_upload

(callable) Rappel à invoquer avant PutObject toute UploadPart opération. Le rappel doit avoir une signature de fonction similaire à :function (Aws\Command $command) {...}. SDKInvoque ce rappel si la taille du fichier est inférieure ou égale à la mup_threshold valeur. Consultez la PutObject APIréférence pour les paramètres que vous pouvez appliquer à la PutObject demande. Pour les paramètres qui s'appliquent à une UploadPart demande, consultez la UploadPart APIréférence. SDKIgnore tout paramètre non applicable à l'opération représentée par l'CommandInterfaceobjet.

concurrency

(int, par défaut : int(3)) Nombre maximal d’opérations UploadPart simultanées autorisées pendant le chargement partitionné.

part_size

(int, par défaut : int(5242880)) Taille de partie, en octets, à utiliser lors d’un chargement partitionné. La valeur doit être comprise entre 5 Mo et 5 Go, inclus.

state

(Aws\Multipart\UploadState) Objet représentant l'état du chargement partitionné et utilisé pour reprendre un chargement précédent. Lorsque cette option est fournie, les $key arguments $bucket et et l'part_sizeoption sont ignorés.

MultipartUploader

Les chargements partitionnés sont conçus pour améliorer l'expérience de chargement pour les objets volumineux. Ils vous permettent de charger des parties d'objets indépendamment, dans n'importe quel ordre, et en parallèle.

Les clients Amazon S3 sont invités à utiliser les téléchargements partitionnés pour les objets de plus de 100 Mo.

MultipartUploader objet

SDKIl possède un MultipartUploader objet spécial qui simplifie le processus de téléchargement en plusieurs parties.

Importations

require 'vendor/autoload.php'; use Aws\Exception\MultipartUploadException; use Aws\S3\MultipartUploader; use Aws\S3\S3Client;

Exemple de code

$s3Client = new S3Client([ 'profile' => 'default', 'region' => 'us-west-2', 'version' => '2006-03-01' ]); // Use multipart upload $source = '/path/to/large/file.zip'; $uploader = new MultipartUploader($s3Client, $source, [ 'bucket' => 'your-bucket', 'key' => 'my-file.zip', ]); try { $result = $uploader->upload(); echo "Upload complete: {$result['ObjectURL']}\n"; } catch (MultipartUploadException $e) { echo $e->getMessage() . "\n"; }

Le chargeur crée un générateur de données partitionnées, en fonction de la source et de la configuration fournies, et tente de charger toutes les parties. Si le chargement de certaines parties échoue, le chargeur continue le chargement des autres parties jusqu'à ce que l'ensemble des données source soient lues. Par la suite, le chargeur tente de charger les parties ayant échoué ou lève une exception contenant des informations sur ces dernières.

Personnalisation d'un téléchargement en plusieurs parties

Vous pouvez définir des options personnalisées sur les opérations CreateMultipartUpload, UploadPart et CompleteMultipartUpload exécutées par le programme de chargement partitionné via des rappels transmis à son constructeur.

Importations

require 'vendor/autoload.php'; use Aws\S3\MultipartUploader; use Aws\S3\S3Client;

Exemple de code

// Create an S3Client $s3Client = new S3Client([ 'profile' => 'default', 'region' => 'us-west-2', 'version' => '2006-03-01' ]); // Customizing a multipart upload $source = '/path/to/large/file.zip'; $uploader = new MultipartUploader($s3Client, $source, [ 'bucket' => 'your-bucket', 'key' => 'my-file.zip', 'before_initiate' => function (Command $command) { // $command is a CreateMultipartUpload operation $command['CacheControl'] = 'max-age=3600'; }, 'before_upload' => function (Command $command) { // $command is an UploadPart operation $command['RequestPayer'] = 'requester'; }, 'before_complete' => function (Command $command) { // $command is a CompleteMultipartUpload operation $command['RequestPayer'] = 'requester'; }, ]);

Collecte manuelle des déchets entre les chargements partiels

Si vous atteignez la limite de mémoire lors de gros téléchargements, cela peut être dû à des références cycliques générées par le fait que le ramasse-miettes n'avait SDK pas encore collecté votre limite de mémoire PHPlorsque votre limite de mémoire a été atteinte. L'appel manuel de l'algorithme de nettoyage entre les opérations peut permettre le traitement des cycles avant que cette limite ne soit atteinte. L'exemple suivant appelle l'algorithme de nettoyage en utilisant un rappel avant le chargement de chaque partie. Notez que l'appel du nettoyage de mémoire représente un coût en termes de performances, et que l'utilisation optimale dépendra de votre cas d'utilisation et de l'environnement.

$uploader = new MultipartUploader($client, $source, [ 'bucket' => 'your-bucket', 'key' => 'your-key', 'before_upload' => function(\Aws\Command $command) { gc_collect_cycles(); } ]);

Récupération après des erreurs

Lorsqu'une erreur se produit au cours du processus de chargement partitionné, une exception MultipartUploadException est levée. Cette exception donne accès à l'objet UploadState, qui contient des informations sur la progression du chargement partitionné. L'objet UploadState peut être utilisé pour reprendre un chargement qui n'a pas pu aboutir.

Importations

require 'vendor/autoload.php'; use Aws\Exception\MultipartUploadException; use Aws\S3\MultipartUploader; use Aws\S3\S3Client;

Exemple de code

// Create an S3Client $s3Client = new S3Client([ 'profile' => 'default', 'region' => 'us-west-2', 'version' => '2006-03-01' ]); $source = '/path/to/large/file.zip'; $uploader = new MultipartUploader($s3Client, $source, [ 'bucket' => 'your-bucket', 'key' => 'my-file.zip', ]); //Recover from errors do { try { $result = $uploader->upload(); } catch (MultipartUploadException $e) { $uploader = new MultipartUploader($s3Client, $source, [ 'state' => $e->getState(), ]); } } while (!isset($result)); //Abort a multipart upload if failed try { $result = $uploader->upload(); } catch (MultipartUploadException $e) { // State contains the "Bucket", "Key", and "UploadId" $params = $e->getState()->getId(); $result = $s3Client->abortMultipartUpload($params); }

Reprendre un chargement à partir d'un objet UploadState permet de tenter de charger les parties qui n'ont pas encore été chargées. L'objet d'état assure le suivi des parties manquantes, même si elles ne se suivent pas. Le chargeur lit ou recherche dans le fichier source fourni les plages d'octets appartenant aux parties qui n'ont pas encore été chargées.

Les objets UploadState étant sérialisables, vous pouvez également reprendre un chargement dans un processus différent. De plus, vous pouvez récupérer l'objet UploadState, même en l'absence d'exception, en appelant la méthode $uploader->getState().

Important

Les flux transmis comme source à un MultipartUploader ne sont pas automatiquement rembobinés avant le chargement. Si vous utilisez un flux à la place d'un chemin d'accès dans une boucle similaire à celle de l'exemple précédent, réinitialisez la variable $source à l'intérieur du bloc catch.

Importations

require 'vendor/autoload.php'; use Aws\Exception\MultipartUploadException; use Aws\S3\MultipartUploader; use Aws\S3\S3Client;

Exemple de code

// Create an S3Client $s3Client = new S3Client([ 'profile' => 'default', 'region' => 'us-west-2', 'version' => '2006-03-01' ]); //Using stream instead of file path $source = fopen('/path/to/large/file.zip', 'rb'); $uploader = new MultipartUploader($s3Client, $source, [ 'bucket' => 'your-bucket', 'key' => 'my-file.zip', ]); do { try { $result = $uploader->upload(); } catch (MultipartUploadException $e) { rewind($source); $uploader = new MultipartUploader($s3Client, $source, [ 'state' => $e->getState(), ]); } } while (!isset($result)); fclose($source);

Interruption d'un chargement partitionné

Un chargement partitionné peut être interrompu en récupérant le UploadId contenu dans l'objet UploadState et en le trnasmettant à abortMultipartUpload.

try { $result = $uploader->upload(); } catch (MultipartUploadException $e) { // State contains the "Bucket", "Key", and "UploadId" $params = $e->getState()->getId(); $result = $s3Client->abortMultipartUpload($params); }

Chargements partitionnés asynchrones

Appeler upload() sur le MultipartUploader constitue une demande de blocage. Si vous travaillez dans un contexte asynchrone, vous pouvez obtenir une promesse pour le chargement partitionné.

require 'vendor/autoload.php'; use Aws\S3\MultipartUploader; use Aws\S3\S3Client;

Exemple de code

// Create an S3Client $s3Client = new S3Client([ 'profile' => 'default', 'region' => 'us-west-2', 'version' => '2006-03-01' ]); $source = '/path/to/large/file.zip'; $uploader = new MultipartUploader($s3Client, $source, [ 'bucket' => 'your-bucket', 'key' => 'my-file.zip', ]); $promise = $uploader->promise();

Configuration

Le constructeur de l'objet MultipartUploader accepte les arguments suivants :

$client

L'objet Aws\ClientInterface à utiliser pour effectuer les transferts. Il doit s'agir d'une instance de Aws\S3\S3Client.

$source

Les données source concernées par le chargement. Il peut s'agir d'un chemin ou URL (par exemple/path/to/file.jpg), d'un descripteur de ressource (par exemple,fopen('/path/to/file.jpg', 'r)) ou d'une instance d'un flux PSR -7.

$config

Un tableau associatif d'options de configuration pour le chargement partitionné.

Les options de configuration suivantes sont valides :

acl

(string) Liste de contrôle d'accès (ACL) à définir sur l'objet en cours de téléchargement. Les objets sont privés par défaut.

before_complete

(callable) Rappel à invoquer avant l'opération CompleteMultipartUpload. Les rappels doivent avoir une signature de fonction telle que function (Aws\Command $command) {...}.

before_initiate

(callable) Rappel à invoquer avant l'opération CreateMultipartUpload. Les rappels doivent avoir une signature de fonction telle que function (Aws\Command $command) {...}.

before_upload

(callable) Rappel à invoquer avant toute opération UploadPart. Les rappels doivent avoir une signature de fonction telle que function (Aws\Command $command) {...}.

bucket

(string, obligatoire) Nom du compartiment vers lequel l’objet est chargé.

concurrency

(int, par défaut : int(5)) Nombre maximal d’opérations UploadPart simultanées autorisées pendant le chargement partitionné.

key

(string, obligatoire) Clé à utiliser pour l’objet concerné par le chargement.

part_size

(int, par défaut : int(5242880)) Taille de partie, en octets, à utiliser lors d’un chargement partitionné. Doit être comprise entre 5 Mo et 5 Go (inclus).

state

(Aws\Multipart\UploadState) Objet représentant l'état du chargement partitionné et utilisé pour reprendre un chargement précédent. Lorsque cette option est fournie, les options bucket, key et part_size sont ignorées.

add_content_md5

(boolean) Réglez sur true pour calculer automatiquement la MD5 somme de contrôle pour le téléchargement.

Copies en plusieurs parties

AWS SDK for PHP Il inclut également un MultipartCopy objet qui est utilisé de la même manière que leMultipartUploader, mais qui est conçu pour copier des objets d'une taille comprise entre 5 Go et 5 To dans Amazon S3.

require 'vendor/autoload.php'; use Aws\Exception\MultipartUploadException; use Aws\S3\MultipartCopy; use Aws\S3\S3Client;

Exemple de code

// Create an S3Client $s3Client = new S3Client([ 'profile' => 'default', 'region' => 'us-west-2', 'version' => '2006-03-01' ]); //Copy objects within S3 $copier = new MultipartCopy($s3Client, '/bucket/key?versionId=foo', [ 'bucket' => 'your-bucket', 'key' => 'my-file.zip', ]); try { $result = $copier->copy(); echo "Copy complete: {$result['ObjectURL']}\n"; } catch (MultipartUploadException $e) { echo $e->getMessage() . "\n"; }