Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Objek perintah dalam AWS SDK for PHP Versi 3
AWS SDK for PHP Menggunakan pola perintah
Penggunaan perintah secara implisit
Jika Anda memeriksa kelas klien apa pun, Anda dapat melihat bahwa metode yang sesuai dengan API operasi sebenarnya tidak ada. Mereka diimplementasikan menggunakan metode __call()
sihir. Metode semu ini sebenarnya adalah pintasan yang merangkum penggunaan objek perintah. SDK
Anda biasanya tidak perlu berinteraksi dengan objek perintah secara langsung. Ketika Anda memanggil metode sepertiAws\S3\S3Client::putObject()
, SDK sebenarnya membuat Aws\CommandInterface
objek berdasarkan parameter yang disediakan, mengeksekusi perintah, dan mengembalikan Aws\ResultInterface
objek yang diisi (atau melempar pengecualian pada kesalahan). Alur serupa terjadi saat memanggil salah satu Async
metode klien (misalnya,Aws\S3\S3Client::putObjectAsync()
): klien membuat perintah berdasarkan parameter yang disediakan, membuat serial HTTP permintaan, memulai permintaan, dan mengembalikan janji.
Contoh-contoh berikut secara fungsional setara.
$s3Client = new Aws\S3\S3Client([ 'version' => '2006-03-01', 'region' => 'us-standard' ]); $params = [ 'Bucket' => 'foo', 'Key' => 'baz', 'Body' => 'bar' ]; // Using operation methods creates a command implicitly $result = $s3Client->putObject($params); // Using commands explicitly $command = $s3Client->getCommand('PutObject', $params); $result = $s3Client->execute($command);
Parameter perintah
Semua perintah mendukung beberapa parameter khusus yang bukan bagian dari layanan API tetapi mengontrol SDK perilaku.
@http
Dengan menggunakan parameter ini, dimungkinkan untuk menyempurnakan cara HTTP handler yang mendasari mengeksekusi permintaan. Opsi yang dapat Anda sertakan dalam @http
parameter sama dengan yang dapat Anda atur saat Anda membuat instance klien dengan opsi klien “http”.
// Configures the command to be delayed by 500 milliseconds $command['@http'] = [ 'delay' => 500, ];
@retries
Seperti opsi klien “coba ulang”, @retries
mengontrol berapa kali perintah dapat dicoba ulang sebelum dianggap gagal. Setel ke 0
untuk menonaktifkan percobaan ulang.
// Disable retries $command['@retries'] = 0;
catatan
Jika Anda telah menonaktifkan percobaan ulang pada klien, Anda tidak dapat mengaktifkannya secara selektif pada perintah individual yang diteruskan ke klien tersebut.
Membuat objek perintah
Anda dapat membuat perintah menggunakan getCommand()
metode klien. Itu tidak segera mengeksekusi atau mentransfer HTTP permintaan, tetapi hanya dieksekusi ketika diteruskan ke execute()
metode klien. Ini memberi Anda kesempatan untuk memodifikasi objek perintah sebelum menjalankan perintah.
$command = $s3Client->getCommand('ListObjects'); $command['MaxKeys'] = 50; $command['Prefix'] = 'foo/baz/'; $result = $s3Client->execute($command); // You can also modify parameters $command = $s3Client->getCommand('ListObjects', [ 'MaxKeys' => 50, 'Prefix' => 'foo/baz/', ]); $command['MaxKeys'] = 100; $result = $s3Client->execute($command);
Perintah HandlerList
Ketika perintah dibuat dari klien, itu diberikan klon dari Aws\HandlerList
objek klien. Perintah diberikan klon dari daftar handler klien untuk memungkinkan perintah menggunakan middleware kustom dan handler yang tidak mempengaruhi perintah lain yang dijalankan klien.
Ini berarti Anda dapat menggunakan HTTP klien yang berbeda per perintah (misalnya,Aws\MockHandler
) dan menambahkan perilaku khusus per perintah melalui middleware. Contoh berikut menggunakan a MockHandler
untuk membuat hasil tiruan alih-alih mengirim HTTP permintaan yang sebenarnya.
use Aws\Result; use Aws\MockHandler; // Create a mock handler $mock = new MockHandler(); // Enqueue a mock result to the handler $mock->append(new Result(['foo' => 'bar'])); // Create a "ListObjects" command $command = $s3Client->getCommand('ListObjects'); // Associate the mock handler with the command $command->getHandlerList()->setHandler($mock); // Executing the command will use the mock handler, which returns the // mocked result object $result = $client->execute($command); echo $result['foo']; // Outputs 'bar'
Selain mengubah handler yang digunakan perintah, Anda juga dapat menyuntikkan middleware khusus ke perintah. Contoh berikut menggunakan tap
middleware, yang berfungsi sebagai pengamat dalam daftar handler.
use Aws\CommandInterface; use Aws\Middleware; use Psr\Http\Message\RequestInterface; $command = $s3Client->getCommand('ListObjects'); $list = $command->getHandlerList(); // Create a middleware that just dumps the command and request that is // about to be sent $middleware = Middleware::tap( function (CommandInterface $command, RequestInterface $request) { var_dump($command->toArray()); var_dump($request); } ); // Append the middleware to the "sign" step of the handler list. The sign // step is the last step before transferring an HTTP request. $list->append('sign', $middleware); // Now transfer the command and see the var_dump data $s3Client->execute($command);
CommandPool
Aws\CommandPool
Ini memungkinkan Anda untuk menjalankan perintah secara bersamaan menggunakan iterator yang menghasilkan Aws\CommandInterface
objek. CommandPool
Ini memastikan bahwa sejumlah perintah yang konstan dijalankan secara bersamaan saat mengulang perintah di kolam (saat perintah selesai, lebih banyak dijalankan untuk memastikan ukuran kolam konstan).
Berikut adalah contoh yang sangat sederhana dari hanya mengirim beberapa perintah menggunakanCommandPool
.
use Aws\S3\S3Client; use Aws\CommandPool; // Create the client $client = new S3Client([ 'region' => 'us-standard', 'version' => '2006-03-01' ]); $bucket = 'example'; $commands = [ $client->getCommand('HeadObject', ['Bucket' => $bucket, 'Key' => 'a']), $client->getCommand('HeadObject', ['Bucket' => $bucket, 'Key' => 'b']), $client->getCommand('HeadObject', ['Bucket' => $bucket, 'Key' => 'c']) ]; $pool = new CommandPool($client, $commands); // Initiate the pool transfers $promise = $pool->promise(); // Force the pool to complete synchronously $promise->wait();
Contoh itu cukup kurang bertenaga untuk. CommandPool
Mari kita coba contoh yang lebih kompleks. Katakanlah Anda ingin mengunggah file pada disk ke bucket Amazon S3. Untuk mendapatkan daftar file dari disk, kita bisa menggunakan PHP'sDirectoryIterator
. Iterator ini menghasilkan objekSplFileInfo
. CommandPool
Menerima iterator yang menghasilkan Aws\CommandInterface
objek, jadi kami memetakan SplFileInfo
objek untuk mengembalikan objek. Aws\CommandInterface
<?php require 'vendor/autoload.php'; use Aws\Exception\AwsException; use Aws\S3\S3Client; use Aws\CommandPool; use Aws\CommandInterface; use Aws\ResultInterface; use GuzzleHttp\Promise\PromiseInterface; // Create the client $client = new S3Client([ 'region' => 'us-standard', 'version' => '2006-03-01' ]); $fromDir = '/path/to/dir'; $toBucket = 'amzn-s3-demo-bucket'; // Create an iterator that yields files from a directory $files = new DirectoryIterator($fromDir); // Create a generator that converts the SplFileInfo objects into // Aws\CommandInterface objects. This generator accepts the iterator that // yields files and the name of the bucket to upload the files to. $commandGenerator = function (\Iterator $files, $bucket) use ($client) { foreach ($files as $file) { // Skip "." and ".." files if ($file->isDot()) { continue; } $filename = $file->getPath() . '/' . $file->getFilename(); // Yield a command that is executed by the pool yield $client->getCommand('PutObject', [ 'Bucket' => $bucket, 'Key' => $file->getBaseName(), 'Body' => fopen($filename, 'r') ]); } }; // Now create the generator using the files iterator $commands = $commandGenerator($files, $toBucket); // Create a pool and provide an optional array of configuration $pool = new CommandPool($client, $commands, [ // Only send 5 files at a time (this is set to 25 by default) 'concurrency' => 5, // Invoke this function before executing each command 'before' => function (CommandInterface $cmd, $iterKey) { echo "About to send {$iterKey}: " . print_r($cmd->toArray(), true) . "\n"; }, // Invoke this function for each successful transfer 'fulfilled' => function ( ResultInterface $result, $iterKey, PromiseInterface $aggregatePromise ) { echo "Completed {$iterKey}: {$result}\n"; }, // Invoke this function for each failed transfer 'rejected' => function ( AwsException $reason, $iterKey, PromiseInterface $aggregatePromise ) { echo "Failed {$iterKey}: {$reason}\n"; }, ]); // Initiate the pool transfers $promise = $pool->promise(); // Force the pool to complete synchronously $promise->wait(); // Or you can chain the calls off of the pool $promise->then(function() { echo "Done\n"; });
CommandPool
konfigurasi
Aws\CommandPool
Konstruktor menerima berbagai opsi konfigurasi.
- konkurensi (dapat dipanggil | int)
-
Jumlah maksimum perintah untuk mengeksekusi secara bersamaan. Menyediakan fungsi untuk mengubah ukuran kolam secara dinamis. Fungsi ini disediakan jumlah permintaan tertunda saat ini dan diharapkan untuk mengembalikan bilangan bulat yang mewakili batas ukuran kolam baru.
- sebelum (dapat dipanggil)
-
Fungsi untuk memanggil sebelum mengirim setiap perintah.
before
Fungsi menerima perintah dan kunci iterator perintah. Anda dapat mengubah perintah sesuai kebutuhan dalambefore
fungsi sebelum mengirim perintah. - terpenuhi (dapat dipanggil)
-
Berfungsi untuk memanggil ketika janji terpenuhi. Fungsi ini disediakan objek hasil, ID iterator yang hasilnya berasal, dan janji agregat yang dapat diselesaikan atau ditolak jika Anda perlu melakukan hubungan pendek pada pool.
- ditolak (dapat dipanggil)
-
Berfungsi untuk memanggil ketika janji ditolak. Fungsi ini disediakan
Aws\Exception
objek, ID iterator tempat pengecualian berasal, dan janji agregat yang dapat diselesaikan atau ditolak jika Anda perlu melakukan hubungan pendek pada kumpulan.
Pengumpulan sampah manual antar perintah
Jika Anda mencapai batas memori dengan kumpulan perintah besar, ini mungkin karena referensi siklik yang dihasilkan oleh yang SDK belum dikumpulkan oleh pengumpul PHP sampahCommandPool
yang memanggil algoritma koleksi menggunakan callback sebelum mengirim setiap perintah. Perhatikan bahwa memanggil pengumpul sampah memang datang dengan biaya kinerja, dan penggunaan optimal akan tergantung pada kasus penggunaan dan lingkungan Anda.
$pool = new CommandPool($client, $commands, [ 'concurrency' => 25, 'before' => function (CommandInterface $cmd, $iterKey) { gc_collect_cycles(); } ]);