Paginatoren in derAWS SDK for PHP Version 3 - AWS SDK for PHP

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Paginatoren in derAWS SDK for PHP Version 3

EinigeAWS Serviceoperationen sind paginiert und antworten mit verkürzten Ergebnissen. Beispielsweise gibt der Amazon S3ListObjects S3-Vorgang nur bis zu 1.000 Objekte gleichzeitig zurück. Operationen wie diese (häufig mit dem Präfix „list“ oder „describe“) erfordern, dass nachfolgende Anforderungen mit Token- (oder Markierungs-) Parametern durchgeführt werden, um den gesamten Satz von Ergebnissen abzurufen.

Paginatoren sind eine Funktion des AWS SDK for PHP, die als Abstraktion für diesen Prozess dient, um Entwicklern die Verwendung paginierter APIs zu erleichtern. Ein Paginator ist im Wesentlichen ein Iterator der Ergebnisse. Sie werden über die getPaginator() -Methode des Clients erstellt. Wenn Sie getPaginator() aufrufen , müssen Sie den Namen der Operation und die Argumente der Operation angeben (auf dieselbe Art und Weise wie bei der Ausführung einer Operation). Sie können mit foreach ein Paginator-Objekt durchlaufen, um einzelne Aws\Result-Objekte zu erhalten.

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

Paginator-Objekte

Das von der getPaginator()-Methode zurückgegebene Objekt ist eine Instance der Aws\ResultPaginator-Klasse. Diese Klasse implementiert die eigene iterator-Schnittstelle von PHP, weshalb sie mit foreach arbeitet. Sie kann auch mit Iterator-Funktionen verwendet werden, z. B. iterator_to_array, und kann problemlos mit SPL-Iteratoren wie dem LimitIterator-Objekt kombiniert werden.

Paginator-Objekte enthalten nur eine „Seite“ der Ergebnisse gleichzeitig und werden langsam ausgeführt. Das bedeutet, dass sie nur so viele Anfragen ausführen, wie erforderlich sind, um die aktuelle Ergebnisseite zu füllen. Beispielsweise gibt der Amazon S3ListObjects S3-Vorgang nur bis zu 1.000 Objekte gleichzeitig zurück. Wenn Ihr Bucket also ~10.000 Objekte enthält, müsste der Paginator insgesamt 10 Anfragen ausführen. Wenn Sie die Ergebnisse durchlaufen, wird die erste Anforderung ausgeführt, wenn Sie die Iteration starten, die zweite in der zweiten Iteration der Schleife usw.

Aufzählen von Daten aus Ergebnissen

Paginator-Objekte haben eine Methode namens search(), mit der Sie Iteratoren für Daten innerhalb einer Ergebnismenge erstellen können. Wenn Sie search() aufrufen, stellen Sie einen JMESPath-Ausdruck bereit, der angibt, welche Daten extrahiert werden. Der Aufruf von search() gibt einen Iterator zurück, der die Ergebnisse des Ausdrucks auf jeder Ergebnisseite ausgibt. Dies wird langsam ausgewertet, weil Sie den zurückgegebenen Iterator durchlaufen.

Das folgende Beispiel entspricht dem vorherigen Codebeispiel, aber verwendet die ResultPaginator::search()-Methode, die kürzer ist.

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

JMESPath-Ausdrücke ermöglichen es Ihnen, relativ komplexe Dinge zu erledigen. Wenn Sie z. B. alle Objektschlüssel und allgemeinen Präfixe ausgeben möchten (d. h. einen ls eines Buckets), können Sie wie folgt vorgehen.

// 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"; }

Asynchrone Paginierung

Sie können die Ergebnisse eines Paginators asynchron durchlaufen, indem Sie einen Callback für die each()-Methode eines Aws\ResultPaginator bereitstellen. Der Callback wird für jeden Wert aufgerufen, der vom Paginator geliefert wird.

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

Mit der each()-Methode können Sie die Ergebnisse einer API-Operation paginieren, während gleichzeitig asynchron weitere Abfragen gesendet werden.

Ein Rückgabewert ungleich Null aus dem Callback wird durch das zugrundeliegende, auf einer Co-Routine basierende Promise erzielt. Das bedeutet, dass Sie Promises aus dem Rückruf, die aufgelöst werden müssen, zurückgeben können, bevor Sie die Iteration über die verbleibenden Positionen fortsetzen und im Wesentlichen in andere Promises zur Iteration übergehen. Der letzte Wert ungleich Null, der von dem Callback zurückgegeben wird, ist das Ergebnis, das das Promise aller nachgelagerten Promises erfüllt. Wenn der letzte Rückgabewert ist ein Promise ist, ist die Auflösung dieses Promise das Ergebnis, das die nachgelagerten Promises erfüllt oder ablehnt.

// 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();