Janji dalam AWS 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.

Janji dalam AWS SDK for PHP Versi 3

AWS SDK for PHPPenggunaan menjanjikan untuk memungkinkan alur kerja asinkron, dan asinkron ini memungkinkan permintaan HTTP dikirim secara bersamaan. Spesifikasi janji yang digunakan oleh SDK adalah Promises/A +.

Apa itu janji?

Janji merupakan hasil akhir dari operasi asinkron. Cara utama berinteraksi dengan janji adalah melalui then metodenya. Metode ini mendaftarkan callback untuk menerima nilai akhir janji atau alasan mengapa janji tidak dapat dipenuhi.

AWS SDK for PHPBergantung pada paket Guzzlehttp/promises Composer untuk implementasi janjinya. Guzzle menjanjikan mendukung alur kerja pemblokiran dan non-pemblokiran dan dapat digunakan dengan loop peristiwa non-pemblokiran apa pun.

catatan

Permintaan HTTP dikirim secara bersamaan dalam AWS SDK for PHP menggunakan satu utas, di mana panggilan non-pemblokiran digunakan untuk mentransfer satu atau beberapa permintaan HTTP saat bereaksi terhadap perubahan status (misalnya, memenuhi atau menolak janji).

Janji di SDK

Janji digunakan di seluruh SDK. Misalnya, janji digunakan di sebagian besar abstraksi tingkat tinggi yang disediakan oleh SDK: paginator, pelayan, kumpulan perintah, unggahan multipart, transferdirektori/bucketS3, dan sebagainya.

Semua klien yang SDK memberikan janji pengembalian saat Anda memanggil salah satu metode Async akhiran. Misalnya, kode berikut menunjukkan cara membuat janji untuk mendapatkan hasil operasi Amazon DescribeTable DynamoDB.

$client = new Aws\DynamoDb\DynamoDbClient([ 'region' => 'us-west-2', 'version' => 'latest', ]); // This will create a promise that will eventually contain a result $promise = $client->describeTableAsync(['TableName' => 'mytable']);

Perhatikan bahwa Anda dapat menelepon salah satu describeTable ataudescribeTableAsync. Metode ini adalah __call metode ajaib pada klien yang didukung oleh model API dan version nomor yang terkait dengan klien. Dengan memanggil metode seperti describeTable tanpa Async akhiran, klien akan memblokir saat mengirim permintaan HTTP dan mengembalikan Aws\ResultInterface objek atau melempar file. Aws\Exception\AwsException Dengan akhiran nama operasi dengan Async (yaitu,describeTableAsync) klien akan membuat janji yang akhirnya dipenuhi dengan Aws\ResultInterface objek atau ditolak dengan. Aws\Exception\AwsException

penting

Ketika janji dikembalikan, hasilnya mungkin sudah tiba (misalnya, saat menggunakan penangan tiruan), atau permintaan HTTP mungkin belum dimulai.

Anda dapat mendaftarkan callback dengan janji dengan menggunakan then metode ini. Metode ini menerima dua callback$onRejected, $onFulfilled dan keduanya bersifat opsional. $onFulfilledPanggilan balik dipanggil jika janji terpenuhi, dan $onRejected panggilan balik dipanggil jika janji ditolak (artinya gagal).

$promise->then( function ($value) { echo "The promise was fulfilled with {$value}"; }, function ($reason) { echo "The promise was rejected with {$reason}"; } );

Menjalankan perintah secara bersamaan

Beberapa janji dapat disusun bersama sedemikian rupa sehingga dieksekusi secara bersamaan. Ini dapat dicapai dengan mengintegrasikan SDK dengan loop peristiwa non-pemblokiran, atau dengan membangun beberapa janji dan menunggu mereka selesai secara bersamaan.

use GuzzleHttp\Promise\Utils; $sdk = new Aws\Sdk([ 'version' => 'latest', 'region' => 'us-east-1' ]); $s3 = $sdk->createS3(); $ddb = $sdk->createDynamoDb(); $promises = [ 'buckets' => $s3->listBucketsAsync(), 'tables' => $ddb->listTablesAsync(), ]; // Wait for both promises to complete. $results = Utils::unwrap($promises); // Notice that this method will maintain the input array keys. var_dump($results['buckets']->toArray()); var_dump($results['tables']->toArray());
catatan

CommandPoolIni menyediakan mekanisme yang lebih kuat untuk mengeksekusi beberapa operasi API secara bersamaan.

Janji rantai

Salah satu aspek terbaik dari janji adalah bahwa mereka dapat dikomposisi, memungkinkan Anda untuk membuat pipeline transformasi. Janji disusun dengan merantai then callback dengan callback berikutnyathen. Nilai pengembalian then metode adalah janji yang dipenuhi atau ditolak berdasarkan hasil callback yang diberikan.

$promise = $client->describeTableAsync(['TableName' => 'mytable']); $promise ->then( function ($value) { $value['AddedAttribute'] = 'foo'; return $value; }, function ($reason) use ($client) { // The call failed. You can recover from the error here and // return a value that will be provided to the next successful // then() callback. Let's retry the call. return $client->describeTableAsync(['TableName' => 'mytable']); } )->then( function ($value) { // This is only invoked when the previous then callback is // fulfilled. If the previous callback returned a promise, then // this callback is invoked only after that promise is // fulfilled. echo $value['AddedAttribute']; // outputs "foo" }, function ($reason) { // The previous callback was rejected (failed). } );
catatan

Nilai pengembalian callback janji adalah $value argumen yang diberikan ke janji hilir. Jika Anda ingin memberikan nilai ke rantai janji hilir, Anda harus mengembalikan nilai dalam fungsi callback.

Penerusan penolakan

Anda dapat mendaftarkan callback untuk memanggil saat janji ditolak. Jika pengecualian dilemparkan dalam panggilan balik apa pun, janji ditolak dengan pengecualian dan janji berikutnya dalam rantai ditolak dengan pengecualian. Jika Anda berhasil mengembalikan nilai dari $onRejected callback, janji-janji berikutnya dalam rantai janji dipenuhi dengan nilai pengembalian dari $onRejected callback.

Menunggu janji

Anda dapat secara sinkron memaksa janji untuk diselesaikan dengan menggunakan wait metode janji.

$promise = $client->listTablesAsync(); $result = $promise->wait();

Jika pengecualian ditemukan saat menjalankan wait fungsi janji, janji ditolak dengan pengecualian dan pengecualian dilemparkan.

use Aws\Exception\AwsException; $promise = $client->listTablesAsync(); try { $result = $promise->wait(); } catch (AwsException $e) { // Handle the error }

waitMemanggil janji yang telah dipenuhi tidak memicu fungsi tunggu. Ini hanya mengembalikan nilai yang dikirimkan sebelumnya.

$promise = $client->listTablesAsync(); $result = $promise->wait(); assert($result ### $promise->wait());

waitMemanggil janji yang telah ditolak memberikan pengecualian. Jika alasan penolakan adalah contoh dari \Exception alasan dilemparkan. Jika tidak, a GuzzleHttp\Promise\RejectionException dilemparkan dan alasannya dapat diperoleh dengan memanggil getReason metode pengecualian.

catatan

Panggilan operasi API di AWS SDK for PHP ditolak dengan subclass Aws\Exception\AwsException kelas. Namun, ada kemungkinan alasan yang dikirim ke suatu then metode berbeda karena penambahan middleware khusus yang mengubah alasan penolakan.

Membatalkan janji

Janji dapat dibatalkan menggunakan cancel() metode janji. Jika janji telah diselesaikan, panggilan tidak cancel() akan berpengaruh. Membatalkan janji membatalkan janji dan janji apa pun yang menunggu pengiriman dari janji. Janji yang dibatalkan ditolak dengan a. GuzzleHttp\Promise\RejectionException

Menggabungkan janji

Anda dapat menggabungkan janji menjadi janji agregat untuk membangun alur kerja yang lebih canggih. guzzlehttp/promisePaket berisi berbagai fungsi yang dapat Anda gunakan untuk menggabungkan janji.

Anda dapat menemukan dokumentasi API untuk semua fungsi pengumpulan janji di namespace- GuzzleHttp .Promise.

masing-masing dan each_limit

Gunakan CommandPoolketika Anda memiliki antrian tugas Aws\CommandInterface perintah untuk melakukan bersamaan dengan ukuran kolam tetap (perintah dapat berada di memori atau dihasilkan oleh iterator malas). CommandPoolIni memastikan bahwa sejumlah perintah tetap dikirim secara bersamaan sampai iterator yang disediakan habis.

CommandPoolBekerja hanya dengan perintah yang dijalankan oleh klien yang sama. Anda dapat menggunakan GuzzleHttp\Promise\each_limit fungsi untuk melakukan perintah kirim dari klien yang berbeda secara bersamaan menggunakan ukuran kolam tetap.

use GuzzleHttp\Promise; $sdk = new Aws\Sdk([ 'version' => 'latest', 'region' => 'us-west-2' ]); $s3 = $sdk->createS3(); $ddb = $sdk->createDynamoDb(); // Create a generator that yields promises $promiseGenerator = function () use ($s3, $ddb) { yield $s3->listBucketsAsync(); yield $ddb->listTablesAsync(); // yield other promises as needed... }; // Execute the tasks yielded by the generator concurrently while limiting the // maximum number of concurrent promises to 5 $promise = Promise\each_limit($promiseGenerator(), 5); // Waiting on an EachPromise will wait on the entire task queue to complete $promise->wait();

Janji coroutine

Salah satu fitur yang lebih kuat dari pustaka janji Guzzle adalah memungkinkan Anda menggunakan coroutine janji yang membuat penulisan alur kerja asinkron tampak lebih seperti menulis alur kerja sinkron tradisional. Bahkan, AWS SDK for PHP penggunaan coroutine menjanjikan di sebagian besar abstraksi tingkat tinggi.

Bayangkan Anda ingin membuat beberapa bucket dan mengunggah file ke bucket saat bucket tersedia, dan Anda ingin melakukan ini semua secara bersamaan sehingga itu terjadi secepat mungkin. Anda dapat melakukan ini dengan mudah dengan menggabungkan beberapa janji coroutine bersama-sama menggunakan fungsi all() promise.

use GuzzleHttp\Promise; $uploadFn = function ($bucket) use ($s3Client) { return Promise\coroutine(function () use ($bucket, $s3Client) { // You can capture the result by yielding inside of parens $result = (yield $s3Client->createBucket(['Bucket' => $bucket])); // Wait on the bucket to be available $waiter = $s3Client->getWaiter('BucketExists', ['Bucket' => $bucket]); // Wait until the bucket exists yield $waiter->promise(); // Upload a file to the bucket yield $s3Client->putObjectAsync([ 'Bucket' => $bucket, 'Key' => '_placeholder', 'Body' => 'Hi!' ]); }); }; // Create the following buckets $buckets = ['foo', 'baz', 'bar']; $promises = []; // Build an array of promises foreach ($buckets as $bucket) { $promises[] = $uploadFn($bucket); } // Aggregate the promises into a single "all" promise $aggregate = Promise\all($promises); // You can then() off of this promise or synchronously wait $aggregate->wait();