Paginator dalamAWS SDK for PHP Versi 3 - AWS SDK for PHP

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Paginator dalamAWS SDK for PHP Versi 3

Beberapa operasiAWS layanan dipaginasi dan merespons dengan hasil terpotong. Misalnya,ListObjects operasi Amazon S3 hanya mengembalikan hingga 1.000 objek sekaligus. Operasi seperti ini (biasanya diawali dengan “list” atau “describe”) memerlukan permintaan selanjutnya dengan parameter token (atau marker) untuk mengambil seluruh rangkaian hasil.

Paginator adalah fitur dariAWS SDK for PHP yang bertindak sebagai abstraksi atas proses ini untuk membuatnya lebih mudah bagi pengembang untuk menggunakan API paginasi. Sebuah paginator pada dasarnya adalah iterator hasil. Mereka dibuat melaluigetPaginator() metode klien. Saat Anda menelepongetPaginator(), Anda harus memberikan nama operasi dan argumen operasi (dengan cara yang sama seperti yang Anda lakukan saat menjalankan operasi). Anda dapat iterate atas objek paginator menggunakanforeach untuk mendapatkanAws\Result objek individu.

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

Benda paginator

Objek dikembalikan dengangetPaginator() metode adalah sebuah instance dariAws\ResultPaginator kelas. Kelas ini mengimplementasikaniterator antarmuka asli PHP, itulah sebabnya ia bekerja denganforeach. Hal ini juga dapat digunakan dengan fungsi iterator, sepertiiterator_to_array, dan terintegrasi dengan baik dengan iterator SPL sepertiLimitIterator objek.

Objek paginator hanya memegang satu “halaman” hasil pada satu waktu dan dieksekusi malas. Ini berarti bahwa mereka hanya membuat permintaan sebanyak yang mereka butuhkan untuk menghasilkan halaman hasil saat ini. Misalnya,ListObjects operasi Amazon S3 hanya mengembalikan hingga 1.000 objek pada satu waktu, jadi jika bucket Anda memiliki ~ 10.000 objek, paginator perlu melakukan total 10 permintaan. Ketika Anda iterate melalui hasil, permintaan pertama dijalankan ketika Anda mulai iterasi, kedua dalam iterasi kedua loop, dan seterusnya.

Menghitung data dari hasil

objek Paginator memiliki metode bernamasearch(), yang memungkinkan Anda untuk membuat iterator untuk data dalam satu set hasil. Saat Anda meneleponsearch(), berikan ekspresi JMESPath untuk menentukan data apa yang akan diekstrak. Memanggilsearch() mengembalikan iterator yang menghasilkan hasil ekspresi pada setiap halaman hasil. Hal ini dievaluasi malas, seperti yang Anda iterate melalui iterator kembali.

Contoh berikut ini setara dengan contoh kode sebelumnya, tetapi menggunakanResultPaginator::search() metode untuk menjadi lebih ringkas.

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

ekspresi JMesPath memungkinkan Anda untuk melakukan hal-hal yang cukup kompleks. Misalnya, jika Anda ingin mencetak semua kunci objek dan awalan umum (yaitu, melakukan ember), Anda bisa melakukan hal berikut.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"; }

Asinkron

Anda dapat iterate atas hasil paginator asynchronous dengan menyediakan callback untukeach() metodeAws\ResultPaginator. Callback dipanggil untuk setiap nilai yang dihasilkan oleh paginator.

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

Menggunakaneach() metode ini memungkinkan Anda untuk paginasi atas hasil operasi API sementara secara bersamaan mengirim permintaan lain asynchronous.

Nilai pengembalian non-null dari callback akan dihasilkan oleh promise berbasis coroutine yang mendasarinya. Ini berarti bahwa Anda dapat mengembalikan promise dari callback yang harus diselesaikan sebelum melanjutkan iterasi atas item yang tersisa, pada dasarnya menggabungkan janji-janji lain ke iterasi. Nilai non-null terakhir yang dikembalikan oleh callback adalah hasil yang memenuhi promise untuk setiap promise hilir. Jika nilai pengembalian terakhir adalah janji, resolusi janji itu adalah hasil yang memenuhi atau menolak janji hilir.

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