

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.

# Verwendung von paginierten Ergebnissen in der AWS SDK für PHP Version 3
<a name="guide_paginators"></a>

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 für 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
<a name="paginator-objects"></a>

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](http://www.php.net/manual/en/spl.iterators.php) 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 S3 `ListObjects` S3-Vorgang nur bis zu 1.000 Objekte gleichzeitig zurück. Wenn Ihr Bucket also \$110.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
<a name="enumerating-data-from-results"></a>

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 [JMESPath Ausdruck](guide_jmespath.md) an`search()`, 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";
}
```

JMESPath Ausdrü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
<a name="async-paginators"></a>

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 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' => '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();
```