AWS SDK for PHP 버전 3의 페이지네이터 - AWS SDK for PHP

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

AWS SDK for PHP 버전 3의 페이지네이터

일부 AWS 서비스 작업은 페이지 지정되며 잘린 결과로 응답합니다. 예를 들어, Amazon S3ListObjects 작업은 한 번에 최대 1,000개의 객체만 반환합니다. 이와 같은 작업(일반적으로 "list" 또는 "describe"라는 접두사가 붙음)을 수행하려면 토큰(또는 마커) 파라미터와 함께 후속 요청을 수행하여 전체 결과 집합을 검색해야 합니다.

페이지네이터는 개발자가 페이지 매김된 API를 쉽게 사용할 수 있도록 이 프로세스에서 추상화 역할을 수행하는 AWS SDK for PHP의 기능입니다. 페이지네이터는 본질적으로 결과의 반복자입니다. 이 기능은 클라이언트의 getPaginator() 메서드를 통해 생성됩니다. getPaginator()를 호출할 때 작업 이름과 작업 인수를 제공해야 합니다(작업을 실행할 때 수행한 것과 동일한 방법 사용). foreach를 사용하는 페이지네이터 객체를 반복하여 개별 Aws\Result 객체를 가져올 수 있습니다.

$results = $s3Client->getPaginator('ListObjects', [ 'Bucket' => 'my-bucket' ]); foreach ($results as $result) { foreach ($result['Contents'] as $object) { echo $object['Key'] . "\n"; } }

페이지네이터 객체

getPaginator() 메서드에서 반환된 객체는 Aws\ResultPaginator 클래스의 인스턴스입니다. 이 클래스는 PHP의 고유 iterator 인터페이스를 구현하며, 이러한 이유로 foreach와 함께 작동합니다. iterator_to_array와 같은 iterator 함수와도 함께 사용할 수 있으며 LimitIterator 객체와 같은 SPL iterator와 잘 통합됩니다.

페이지네이터 객체는 한 번에 한 "페이지"의 결과만 보유하며 지연 실행됩니다. 따라서 결과의 동시 페이지를 산출하는 데 필요한 수의 요청만 수행합니다. 예를 들어, Amazon S3ListObjects 작업은 한 번에 최대 1,000개의 객체만 반환하므로, 버킷에 ~10,000개의 객체가 있는 경우 페이지네이터는 총 10개의 요청을 수행해야 합니다. 결과를 반복하면 반복을 시작할 때 첫 번째 요청이 실행되고 루프의 두 번째 반복에서 두 번째 요청이 실행되며 같은 방식으로 계속됩니다.

결과의 데이터 열거

페이지네이터 객체에는 search()라는 메서드가 있습니다. 이 메서드를 사용하여 결과 집합 내의 데이터에 대한 반복자를 생성할 수 있습니다. search()를 호출할 때 JMESPath 표현식을 제공하여 어떤 데이터를 추출할지를 지정합니다. search()를 호출하면 결과의 각 페이지에서 표현식의 결과를 산출하는 반복자가 반환됩니다. 반환된 반복자를 반복하므로 이 값은 늦게 평가됩니다.

다음 예제는 이전 코드 예제와 동등하지만, 더 간결하게 하기 위해 ResultPaginator::search() 메서드를 사용합니다.

$results = $s3Client->getPaginator('ListObjects', [ 'Bucket' => 'my-bucket' ]); foreach ($results->search('Contents[].Key') as $key) { echo $key . "\n"; }

JMESPath 표현식을 사용하면 상당히 복잡한 작업을 수행할 수 있습니다. 예를 들어, 모든 객체 키와 공통 접두사를 인쇄하려는 경우(예: 버킷의 ls 실행) 다음을 수행할 수 있습니다.

// List all prefixes ("directories") and objects ("files") in the bucket $results = $s3Client->getPaginator('ListObjects', [ 'Bucket' => 'my-bucket', 'Delimiter' => '/' ]); $expression = '[CommonPrefixes[].Prefix, Contents[].Key][]'; foreach ($results->search($expression) as $item) { echo $item . "\n"; }

비동기 페이지 매김

each()Aws\ResultPaginator 메서드에 콜백을 제공하여 페이지네이터의 결과를 비동기적으로 반복할 수 있습니다. 페이지네이터에서 산출되는 각 값에 대해 콜백이 호출됩니다.

$results = $s3Client->getPaginator('ListObjects', [ 'Bucket' => 'my-bucket' ]); $promise = $results->each(function ($result) { echo 'Got ' . var_export($result, true) . "\n"; });
참고

each() 메서드를 사용하면 다른 요청을 비동기적으로 동시에 전송하면서 API 작업의 결과에 페이지를 매길 수 있습니다.

기본 코루틴 기반 promise에서 콜백의 null이 아닌 반환 값이 산출됩니다. 따라서 남은 항목을 계속 반복하여 본질적으로 다른 promise를 반복에 병합하기 전에 해결해야 하는 콜백의 promise를 반환할 수 있습니다. 콜백에서 반환되는 마지막 null이 아닌 값은 다운스트림 promise까지 promise를 이행하는 결과입니다. 마지막 반환 값이 promise인 경우 해당 promise의 해결은 다운스트림 promise를 이행하거나 거부하는 결과입니다.

// Delete all keys that end with "Foo" $promise = $results->each(function ($result) use ($s3Client) { if (substr($result['Key'], -3) === 'Foo') { // Merge this promise into the iterator return $s3Client->deleteAsync([ 'Bucket' => 'my-bucket', 'Key' => 'Foo' ]); } }); $promise ->then(function ($result) { // Result would be the last result to the deleteAsync operation }) ->otherwise(function ($reason) { // Reason would be an exception that was encountered either in the // call to deleteAsync or calls performed while iterating }); // Forcing a synchronous wait will also wait on all of the deleteAsync calls $promise->wait();