Esperadores en la versión 3 de AWS SDK for PHP - 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.

Esperadores en la versión 3 de AWS SDK for PHP

Los esperadores facilitan el trabajo con sistemas de consistencia final proporcionando una forma abstracta de esperar hasta que un recurso pasa a un estado determinado sondeando el recurso. En la documentación de la APIde un servicio de cliente encontrará la lista de los esperadores compatibles para una versión concreta de un cliente de servicio. Para acceder a ella, acceda a la página del cliente en la documentación de la API, vaya al número de versión específico (representado por una fecha) y desplácese hacia abajo hasta la sección "Esperadores". Este enlace le llevará a la sección de esperadores de S3.

En el siguiente ejemplo, el cliente se utiliza el cliente de Amazon S3 para crear un bucket. A continuación, el esperador se utiliza para esperar hasta que exista el bucket.

// Create a bucket $s3Client->createBucket(['Bucket' => 'my-bucket']); // Wait until the created bucket is available $s3Client->waitUntil('BucketExists', ['Bucket' => 'my-bucket']);

Si el esperador tiene que sondear el bucket demasiadas veces, lanzará una excepción \RuntimeException.

Configuración del esperador

Los esperadores actúan en función de una matriz asociativa de opciones de configuración. Todas las opciones que utiliza un esperador determinado tienen valores predeterminados, pero se pueden reemplazar por otros para aplicar estrategias de espera distintas.

Puede modificar las opciones de configuración de los esperadores pasando una matriz asociativa de opciones @waiter al argumento $args de los métodos waitUntil() y getWaiter() de un cliente.

// Providing custom waiter configuration options to a waiter $s3Client->waitUntil('BucketExists', [ 'Bucket' => 'my-bucket', '@waiter' => [ 'delay' => 3, 'maxAttempts' => 10 ] ]);
delay (entero)

Es el número de segundos de retraso entre los intentos de sondeo. Cada esperador dispone de un valor de configuración delay predeterminado, pero es posible que tenga que modificarlo para casos de uso específicos.

maxAttempts (entero)

Es el número máximo de intentos de sondeo a emitir antes de que el esperador falle. Esta opción garantiza que no tenga que esperar un recurso de forma indefinida. Cada esperador dispone de un valor de configuración maxAttempts predeterminado, pero es posible que tenga que modificarlo para casos de uso específicos.

initDelay (entero)

Es el intervalo de tiempo en segundos que hay que esperar hasta el primer intento de sondeo. Esto puede ser útil cuando se espera a un recurso, del que se sabe que tarda un rato en pasar al estado deseado.

before (invocable)

Es una función invocable PHP que se invoca antes de cada intento. La función invocable se invoca con el comando Aws\CommandInterface que está a punto de ejecutarse y el número de intentos que se han ejecutado hasta el momento. La función invocable before se puede utilizar para modificar los comandos antes de ejecutarlos o para proporcionar información de progreso.

use Aws\CommandInterface; $s3Client->waitUntil('BucketExists', [ 'Bucket' => 'my-bucket', '@waiter' => [ 'before' => function (CommandInterface $command, $attempts) { printf( "About to send %s. Attempt %d\n", $command->getName(), $attempts ); } ] ]);

Espera asíncrona

Además de la espera síncrona, puede invocar un esperador para que espere de forma asíncrona mientras envía otras solicitudes o espera a varios recursos de forma simultánea.

Para obtener acceso a una promesa de un esperador, recupérelo de un cliente utilizando el método getWaiter($name, array $args = []) del cliente. Utilice el método promise() de un esperador para iniciarlo. Una promesa de esperador se cumple con la última Aws\CommandInterface ejecutada en el esperador y rechazada con una excepción RuntimeException al producirse un error.

use Aws\CommandInterface; $waiterName = 'BucketExists'; $waiterOptions = ['Bucket' => 'my-bucket']; // Create a waiter promise $waiter = $s3Client->getWaiter($waiterName, $waiterOptions); // Initiate the waiter and retrieve a promise $promise = $waiter->promise(); // Call methods when the promise is resolved. $promise ->then(function () { echo "Waiter completed\n"; }) ->otherwise(function (\Exception $e) { echo "Waiter failed: " . $e . "\n"; }); // Block until the waiter completes or fails. Note that this might throw // a \RuntimeException if the waiter fails. $promise->wait();

Exponer la API de esperadores basados en promesas permite casos de uso potentes y con relativamente poca sobrecarga. Por ejemplo, ¿qué sucede si desea esperar a varios recursos y hacer algo con el primer esperador que se resuelva correctamente?

use Aws\CommandInterface; // Create an array of waiter promises $promises = [ $s3Client->getWaiter('BucketExists', ['Bucket' => 'a'])->promise(), $s3Client->getWaiter('BucketExists', ['Bucket' => 'b'])->promise(), $s3Client->getWaiter('BucketExists', ['Bucket' => 'c'])->promise() ]; // Initiate a race between the waiters, fulfilling the promise with the // first waiter to complete (or the first bucket to become available) $any = Promise\any($promises) ->then(function (CommandInterface $command) { // This is invoked with the command that succeeded in polling the // resource. Here we can know which bucket won the race. echo "The {$command['Bucket']} waiter completed first!\n"; }); // Force the promise to complete $any->wait();