Seguimiento del progreso - AWS SDK para 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.

Seguimiento del progreso

S3 Transfer Manager proporciona funciones integradas de seguimiento del progreso.

Seguimiento de todas las operaciones

Puede habilitar el seguimiento de todas las operaciones (archivos y directorios) track_progress configurándolo true en la S3TransferManager instancia.

<?php use Aws\S3\S3Transfer\S3TransferManager; require __DIR__ . '/../vendor/autoload.php'; $transferManager = new S3TransferManager( null, [ 'track_progress' => true, ] );

Con esta configuración, el SDK usa el integrado SingleProgressTracker <add link> para las operaciones con archivos y usa el MultiProgressTracker <add link>para las operaciones de directorio.

Rastrear una operación de un solo archivo

Si no habilitaste el seguimiento del progreso en el administrador de transferencias, puedes habilitar el seguimiento en un método individual de dos maneras.

track_progresstrueConfigúrelo en la $config matriz para una operación de archivo específica.

<?php use Aws\S3\S3Transfer\Models\UploadDirectoryRequest; use Aws\S3\S3Transfer\S3TransferManager; require __DIR__ . '/../vendor/autoload.php'; $transferManager = new S3TransferManager( null, [] ); $uploadDirPromise = $transferManager->uploadDirectory( new UploadDirectoryRequest( '/path/to/directory', 'amzn-s3-demo-bucket', [], [ // $config array 'track_progress' => true, ], [] ) );
Cree una nueva SingleProgressTracker instancia o proporcione una implementación personalizada deAbstractTransferListener. Pase su rastreador a las operaciones del archivo como $progressTracker parámetro.
<?php use Aws\S3\S3Transfer\Models\UploadRequest; use Aws\S3\S3Transfer\Progress\SingleProgressTracker; use Aws\S3\S3Transfer\S3TransferManager; require __DIR__ . '/../vendor/autoload.php'; $transferManager = new S3TransferManager( null, [] ); $uploadPromise = $transferManager->upload( new UploadRequest( '/path/to/Myfile.txt', // Or an instance of StreamInterface. [ 'Bucket' => 'amzn-s3-demo-bucket', 'Key' => 'file.txt', ], [], [], new SingleProgressTracker() // Or custom implementation of the TransferLister interface. ) );

En el siguiente ejemplo, se muestra un ejemplo del resultado de la consola integrada SingleProgressTracker para ver el progreso de la carga de un archivo denominadoMyFile.txt:

El resultado de la consola muestra una barra de progreso para cargar un MyFile archivo.txt con el porcentaje completado y la velocidad de transferencia

Seguimiento de una sola operación de directorio

Si no habilitaste el seguimiento del progreso en el administrador de transferencias, puedes habilitarlo para las operaciones de directorio de dos maneras.

Establece 'track_progress' true en el argumento de $config matriz del método.
<?php use Aws\S3\S3Transfer\Models\UploadDirectoryRequest; use Aws\S3\S3Transfer\S3TransferManager; require __DIR__ . '/../vendor/autoload.php'; $transferManager = new S3TransferManager( null, [] ); $uploadDirPromise = $transferManager->uploadDirectory( new UploadDirectoryRequest( '/path/to/directory', 'amzn-s3-demo-bucket', [], [ // $config array 'track_progress' => true, ], [] ) );
Crea una nueva MultiProgressTracker instancia y pásala al directorio de operaciones como parámetro. $progressTracker
<?php use Aws\S3\S3Transfer\Models\UploadDirectoryRequest; use Aws\S3\S3Transfer\Progress\MultiProgressTracker; use Aws\S3\S3Transfer\S3TransferManager; require __DIR__ . '/../vendor/autoload.php'; $transferManager = new S3TransferManager( null, [] ); $uploadDirPromise = $transferManager->uploadDirectory( new UploadDirectoryRequest( '/path/to/directory', 'amzn-s3-demo-bucket', [], [], [], new MultiProgressTracker() ) );

En el siguiente ejemplo, se muestra un ejemplo del resultado de la consola integrada MultiProgressTracker para el progreso de la carga de un directorio:

El resultado de la consola muestra varias barras de progreso para cargar varios archivos, con una barra de resumen del progreso en la parte inferior

El progreso de cada archivo aparece junto con el progreso resumido en la última línea.

Seguimiento del progreso personalizado

Puede implementar su propio seguimiento del progreso de las operaciones con archivos. Crea una clase que amplíe la AbstractTransferListener interfaz y pásala al método de la solicitud.

La siguiente implementación muestra la información de progreso en formato de texto para una sola operación de archivo:

<?php use Aws\S3\S3Transfer\Models\UploadRequest; use Aws\S3\S3Transfer\Progress\AbstractTransferListener; use Aws\S3\S3Transfer\S3TransferManager; require __DIR__ . '/../vendor/autoload.php'; class MyProgressTracker extends AbstractTransferListener { public function transferInitiated(array $context): void { $key = $context['request_args']['Key'] ?? 'unknown'; echo "Starting transfer of {$key}...\n"; } public function bytesTransferred(array $context): bool { $snapshot = $context['progress_snapshot']; $percent = round($snapshot->ratioTransferred() * 100, 2); $transferred = round($snapshot->getTransferredBytes() / 1024 / 1024, 2); $total = round($snapshot->getTotalBytes() / 1024 / 1024, 2); echo "Progress: {$percent}% ({$transferred}MB of {$total}MB)\n"; } public function transferComplete(array $context): void { $key = $context['request_args']['Key'] ?? 'unknown'; echo "Transfer complete for {$key}!\n"; } public function transferFail(array $context): void { $key = $context['request_args']['Key'] ?? 'unknown'; $reason = $context['reason']->getMessage(); echo "Transfer failed for {$key}: {$reason}\n"; } } $transferManager = new S3TransferManager( null, [] ); // Use your custom tracker. $uploadPromise = $transferManager->upload( new UploadRequest( '/path/to/file.txt', // Or an instance of StreamInterface. [ 'Bucket' => 'amzn-s3-demo-bucket', 'Key' => 'file.txt', ], [], [], new MyProgressTracker() ) );

El siguiente ejemplo muestra un ejemplo de salida a la consola para la carga de archivos en curso:

Starting transfer of file.txt... Progress: 42% (16.8MB of 40MB)

Personalice un rastreador de progreso integrado

Puedes personalizar el seguimiento del progreso de varias maneras:

  • Cree una implementación personalizada ampliándola AbstractTransferListener e implementándola ProgressTrackerInterface<add link>.

  • Personalice las implementaciones existentes configurando las ConsoleProgressBar <add link> que se transfieren a los rastreadores integrados.

  • Implemente una personalización ProgressBar <add link> y pásela a los rastreadores integrados.

Los siguientes ejemplos muestran cómo personalizar el seguimiento del progreso. Consulta el diagrama de clases para ver la relación entre los componentes del seguimiento del progreso del SDK.

Personaliza un ConsoleProgressBar

Personalice el formato de barra predeterminado

El siguiente ejemplo personaliza el formato predeterminado de la barra de progreso, que es ColoredTransferProgressBarFormat<add link>. Este formato muestra el progreso con diferentes colores según el estado de la transferencia.

El ejemplo cambia:

  • el carácter del predeterminado «#» a «=»

  • ancho de barra: de 50 a 100 por defecto

<?php use Aws\S3\S3Client; use Aws\S3\S3Transfer\Models\UploadRequest; use Aws\S3\S3Transfer\Progress\ConsoleProgressBar; use Aws\S3\S3Transfer\Progress\SingleProgressTracker; use Aws\S3\S3Transfer\S3TransferManager; require __DIR__ . '/../vendor/autoload.php'; $progressBar = new ConsoleProgressBar( progressBarChar: '=', progressBarWidth: 100, // Default `ColoredTransferProgressBarFormat` is used. ); $progressTracker = new SingleProgressTracker( progressBar: $progressBar, ); $s3Client = new S3Client([ 'region' => 'us-east-2', ]); $s3TransferManager = new S3TransferManager($s3Client); $source = "/path/file.txt"; $result = $s3TransferManager->upload( new UploadRequest( source: $source, uploadRequestArgs: [ 'Bucket' => 'amzn-s3-demo-bucket', 'Key' => 'key', ], progressTracker: $progressTracker, ) )->wait(); print_r($result);

La siguiente imagen muestra la salida de consola de un dispositivo integrado personalizado ConsoleProgressBar con un ancho de 100 y un carácter de «=»:

El resultado de la consola muestra una barra de progreso personalizada con signos iguales y un ancho de 100 caracteres

Personalízala usando el formato de barra de progreso simple

En el siguiente ejemplo, se personaliza la barra de progreso predeterminada mediante la integrada PlainProgressBarFormat <add link> con un carácter y un ancho personalizados. Solo se PlainProgressBarFormat muestra en negro. El color no cambia en función del estado de la transferencia.

El ejemplo cambia:

  • el carácter del predeterminado «#» a «*»

  • ancho de barra: de 50 a 25 por defecto

  • la progressBarFormat instancia predeterminada de ColoredTransferProgressBarFormat a PlainProgressBarFormat

<?php use Aws\S3\S3Client; use Aws\S3\S3Transfer\Models\UploadRequest; use Aws\S3\S3Transfer\Progress\ConsoleProgressBar; use Aws\S3\S3Transfer\Progress\PlainProgressBarFormat; use Aws\S3\S3Transfer\Progress\SingleProgressTracker; use Aws\S3\S3Transfer\S3TransferManager; require __DIR__ . '/../vendor/autoload.php'; $progressBar = new ConsoleProgressBar( progressBarChar: '*', progressBarWidth: 25, progressBarFormat: new PlainProgressBarFormat(), ); $progressTracker = new SingleProgressTracker( progressBar: $progressBar, ); $s3Client = new S3Client([ 'region' => 'us-east-2', ]); $s3TransferManager = new S3TransferManager($s3Client); $source = "/path/file.txt"; $result = $s3TransferManager->upload( new UploadRequest( source: $source, uploadRequestArgs: [ 'Bucket' => 'amzn-s3-demo-bucket', 'Key' => 'key', ], progressTracker: $progressTracker, ) )->wait(); print_r($result);

La siguiente imagen muestra la salida de consola de un dispositivo integrado personalizado ConsoleProgressBar con un formato de barra de progreso simple con un ancho de 25 y un carácter de «*»:

La salida de la consola muestra una barra de progreso negra lisa con asteriscos con un ancho de 25 caracteres

Personalízala creando un nuevo formato de barra

En el siguiente ejemplo, se personaliza la barra de progreso predeterminada mediante un nuevo formato de barra (extendido ProgressBarFormat<add link>) en lugar de personalizar un formato integrado.

<?php use Aws\S3\S3Client; use Aws\S3\S3Transfer\Models\UploadRequest; use Aws\S3\S3Transfer\Progress\ConsoleProgressBar; use Aws\S3\S3Transfer\Progress\ProgressBarFormat; use Aws\S3\S3Transfer\Progress\SingleProgressTracker; use Aws\S3\S3Transfer\S3TransferManager; require __DIR__ . '/../vendor/autoload.php'; // Implement a custom bar format. class PercentBarFormat extends ProgressBarFormat { public const FORMAT_TEMPLATE = "|object_name| - |percent|% [|transferred| |unit|ytes]"; public const FORMAT_PARAMETERS = [ 'object_name', // `uploadRequestArgs` Key parameter. 'percent', // Percent transferred. // 'progress_bar', Optional, if used, default is a `ConsoleProgressBar`. // 'to_be_transferred', Optional. 'transferred', // Default is bytes transferred. 'unit', // Default is 'B'. ]; public function getFormatTemplate(): string { return self::FORMAT_TEMPLATE; } public function getFormatParameters(): array { return self::FORMAT_PARAMETERS; } protected function getFormatDefaultParameterValues(): array { return []; } } // Create an instance of the custom implemention $progressBarFormat = new PercentBarFormat(); $progressBar = new ConsoleProgressBar( progressBarFormat: $progressBarFormat, ); $progressTracker = new SingleProgressTracker( progressBar: $progressBar, ); $s3Client = new S3Client([ 'region' => 'us-east-2', ]); $s3TransferManager = new S3TransferManager($s3Client); $source = "/path/file"; $result = $s3TransferManager->upload( new UploadRequest( source: $source, uploadRequestArgs: [ 'Bucket' => 'amzn-s3-demo-bucket', 'Key' => 'key', ], progressTracker: $progressTracker, ) )->wait(); print_r($result);

La siguiente imagen muestra el resultado de la consola para un elemento integrado personalizado ConsoleProgressBar con un formato de barra de progreso personalizado:

El resultado de la consola muestra un formato de progreso personalizado basado en porcentajes que muestra el nombre del objeto y los bytes transferidos

Un formato de barra personalizado acepta varios parámetros:

  • object_name

  • porcentaje

  • barra de progreso

  • para ser transferido

  • transferida

  • unidad

Puede combinar los nombres de los parámetros delimitados (caracteres de barra vertical) para personalizar la salida. En el ejemplo se utiliza la siguiente plantilla. El getFormatTemplate método de la PercentBarFormat clase devuelve esta plantilla:

"|object_name| - |percent|% [|transferred| |unit|ytes]"