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
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. $onFulfilled
Panggilan 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 }
wait
Memanggil 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());
wait
Memanggil 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/promise
Paket 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). CommandPool
Ini memastikan bahwa sejumlah perintah tetap dikirim secara bersamaan sampai iterator yang disediakan habis.
CommandPool
Bekerja 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();