Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Paginator dalam Versi 3 AWS SDK for PHP
Beberapa operasi AWS layanan diberi paginasi 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 membuat permintaan berikutnya dengan parameter token (atau marker) untuk mengambil seluruh rangkaian hasil.
Paginator adalah fitur AWS SDK for PHP yang bertindak sebagai abstraksi atas proses ini untuk memudahkan pengembang menggunakan paginated. APIs Sebuah paginator pada dasarnya adalah iterator hasil. Mereka dibuat melalui getPaginator()
metode klien. Ketika Anda memanggilgetPaginator()
, Anda harus memberikan nama operasi dan argumen operasi (dengan cara yang sama Anda lakukan ketika Anda menjalankan operasi). Anda dapat mengulangi objek paginator menggunakan foreach
untuk mendapatkan objek individu. Aws\Result
$results = $s3Client->getPaginator('ListObjects', [ 'Bucket' => 'amzn-s3-demo-bucket' ]); foreach ($results as $result) { foreach ($result['Contents'] as $object) { echo $object['Key'] . "\n"; } }
Objek paginator
Objek yang dikembalikan oleh getPaginator()
metode adalah contoh dari Aws\ResultPaginator
kelas. Kelas ini mengimplementasikan PHP iterator
antarmuka asli, itulah sebabnya ia bekerja denganforeach
. Hal ini juga dapat digunakan dengan fungsi iterator, sepertiiterator_to_array
, dan terintegrasi dengan baik dengan SPLiterator seperti objekLimitIterator
Objek paginator hanya menyimpan satu “halaman” hasil pada satu waktu dan dieksekusi dengan 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 sekaligus, jadi jika bucket Anda memiliki ~10.000 objek, paginator perlu melakukan total 10 permintaan. Ketika Anda mengulangi hasil, permintaan pertama dijalankan ketika Anda mulai iterasi, yang kedua dalam iterasi kedua dari 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 memanggilsearch()
, berikan JMESPathekspresi untuk menentukan data apa yang akan diekstrak. Memanggil search()
mengembalikan iterator yang menghasilkan hasil ekspresi pada setiap halaman hasil. Ini dievaluasi dengan malas, saat Anda mengulangi iterator yang dikembalikan.
Contoh berikut ini setara dengan contoh kode sebelumnya, tetapi menggunakan ResultPaginator::search()
metode ini agar lebih ringkas.
$results = $s3Client->getPaginator('ListObjects', [ 'Bucket' => 'amzn-s3-demo-bucket' ]); foreach ($results->search('Contents[].Key') as $key) { echo $key . "\n"; }
JMESPathekspresi memungkinkan Anda untuk melakukan hal-hal yang cukup kompleks. Misalnya, jika Anda ingin mencetak semua kunci objek dan awalan umum (yaitu, melakukan ember), Anda dapat melakukan hal berikut. ls
// 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"; }
pagination asinkron
Anda dapat mengulangi hasil paginator secara asinkron dengan menyediakan callback untuk metode. each()
Aws\ResultPaginator
Callback dipanggil untuk setiap nilai yang dihasilkan oleh paginator.
$results = $s3Client->getPaginator('ListObjects', [ 'Bucket' => 'amzn-s3-demo-bucket' ]); $promise = $results->each(function ($result) { echo 'Got ' . var_export($result, true) . "\n"; });
catatan
Menggunakan each()
metode ini memungkinkan Anda untuk melakukan paginasi atas hasil API operasi sambil secara bersamaan mengirim permintaan lain secara asinkron.
Nilai pengembalian non-null dari callback akan dihasilkan oleh janji berbasis coroutine yang mendasarinya. Ini berarti Anda dapat mengembalikan janji dari panggilan balik yang harus diselesaikan sebelum melanjutkan iterasi atas item yang tersisa, pada dasarnya menggabungkan janji lain ke iterasi. Nilai non-null terakhir yang dikembalikan oleh callback adalah hasil yang memenuhi janji untuk setiap janji 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' => '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();