Paginatoren in der Version 3 AWS SDK for PHP - 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 der Version 3 AWS SDK for PHP

Einige AWS Serviceoperationen sind paginiert und antworten mit verkürzten Ergebnissen. Beispielsweise gibt der Amazon S3 ListObjects 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 von AWS SDK for PHP , die als Abstraktion für diesen Prozess dienen, um Entwicklern die Verwendung von paginierten Seiten zu erleichtern. APIs 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' => 'amzn-s3-demo-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 PHP die native iterator Schnittstelle, weshalb sie mit funktioniert. foreach Sie kann auch mit Iteratorfunktionen wie iterator_to_array dem Objekt verwendet werden und lässt sich gut in SPLIteratoren wie das LimitIterator Objekt integrieren.

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 S3 ListObjects 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 bearbeiten. 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. Geben Sie beim Aufrufen einen JMESPathAusdruck ansearch(), um anzugeben, welche Daten extrahiert werden sollen. 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' => 'amzn-s3-demo-bucket' ]); foreach ($results->search('Contents[].Key') as $key) { echo $key . "\n"; }

JMESPathAusdrücke ermöglichen es Ihnen, ziemlich komplexe Dinge zu tun. 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' => 'amzn-s3-demo-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' => 'amzn-s3-demo-bucket' ]); $promise = $results->each(function ($result) { echo 'Got ' . var_export($result, true) . "\n"; });
Anmerkung

Mit each() dieser Methode können Sie die Ergebnisse eines API Vorgangs paginieren und gleichzeitig andere Anfragen asynchron senden.

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' => 'amzn-s3-demo-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();