기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
AWS SDK for PHP 버전 3의 웨이터
Waiter를 사용하면 리소스를 폴링하여 리소스가 특정 상태로 전환될 때까지 대기할 수 있는 추상화된 방법을 제공하여 시스템을 더 쉽고 일관되게 사용할 수 있습니다. 서비스 클라이언트의 단일 버전에 대한 API 설명서를 확인하여 클라이언트에서 지원하는 웨이터 목록을 찾을 수 있습니다. 이 페이지를 탐색하려면 API 설명서의 클라이언트 페이지로 이동하여 특정 버전 번호(날짜로 표시됨)로 이동한 다음 아래로 스크롤하여 '웨이터' 섹션으로 이동합니다. 이 링크를 클릭하면 S3의 웨이터 섹션으로 이동합니다.
다음 예에서 Amazon S3 클라이언트는 버킷을 생성하는 데 사용됩니다. Waiter는 버킷이 존재할 때까지 대기하는 데 사용됩니다.
// Create a bucket $s3Client->createBucket(['Bucket' => 'amzn-s3-demo-bucket']); // Wait until the created bucket is available $s3Client->waitUntil('BucketExists', ['Bucket' => 'amzn-s3-demo-bucket']);
waiter에서 버킷을 지나치게 많이 폴링해야 하는 경우 \RuntimeException
예외를 발생합니다.
Waiter 구성
Waiter는 구성 옵션의 결합형 배열을 기반으로 합니다. 특정 waiter에서 사용되는 모든 옵션은 기본값이 있지만, 다른 대기 전략을 지원하도록 재정의할 수 있습니다.
@waiter
옵션의 결합형 배열을 클라이언트의 waitUntil()
및 getWaiter()
메서드의 $args
인수에 전달하여 waiter 구성 옵션을 수정할 수 있습니다.
// Providing custom waiter configuration options to a waiter $s3Client->waitUntil('BucketExists', [ 'Bucket' => 'amzn-s3-demo-bucket', '@waiter' => [ 'delay' => 3, 'maxAttempts' => 10 ] ]);
- delay (int)
-
폴링 시도 사이의 지연 시간(초)입니다. 각 waiter에는 기본
delay
구성 값이 있지만, 특정 사용 사례에 대해 이 설정을 수정해야 할 수 있습니다. - maxAttempts (int)
-
waiter를 실패로 처리하기 이전의 최대 폴링 시도 횟수입니다. 이 옵션은 리소스를 무기한으로 대기하지 않도록 해줍니다. 각 waiter에는 기본
maxAttempts
구성 값이 있지만, 특정 사용 사례에 대해 이 설정을 수정해야 할 수 있습니다. - initDelay (int)
-
최초 폴링 시도 이전에 대기할 시간(초)입니다. 이 옵션은 원하는 상태로 전환되는 데 시간이 걸릴 것을 알고 잇는 리소스를 대기할 때 유용합니다.
- before (callable)
-
각 시도 전에 호출되는 PHP 호출 가능한 함수입니다. callable 함수는 실행할
Aws\CommandInterface
명령과 지금까지 실행된 횟수를 기준으로 호출됩니다.before
callable 함수를 사용하여 실행되기 전에 명령을 수정하거나 진행률 정보를 제공할 수 있습니다.use Aws\CommandInterface; $s3Client->waitUntil('BucketExists', [ 'Bucket' => 'amzn-s3-demo-bucket', '@waiter' => [ 'before' => function (CommandInterface $command, $attempts) { printf( "About to send %s. Attempt %d\n", $command->getName(), $attempts ); } ] ]);
비동기적 대기
비동기적으로 대기하는 이외에 waiter를 호출하여 다른 요청을 보내거나 한 번에 여러 리소스를 대기하면서 비동기적으로 대기할 수 있습니다.
클라이언트의 getWaiter($name, array $args = [])
메서드를 사용하여 클라이언트에서 waiter를 검색하여 waiter promise에 액세스할 수 있습니다. waiter의 promise()
메서드를 사용하여 waiter를 시작합니다. waiter promise는 waiter에서 실행된 마지막 Aws\CommandInterface
를 통해 이행되며, 오류 시 RuntimeException
과 함께 거부됩니다.
use Aws\CommandInterface; $waiterName = 'BucketExists'; $waiterOptions = ['Bucket' => 'amzn-s3-demo-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();
약속 기반 웨이터를 노출API하면 강력하고 비교적 낮은 오버헤드 사용 사례가 가능합니다. 예를 들어, 여러 리소스를 대기하고, 확인된 첫 번째 waiter를 처리하려는 경우 어떻게 될까요?
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();