Upgrade dari Versi 2 AWS SDK for PHP - AWS SDK for PHP

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

Upgrade dari Versi 2 AWS SDK for PHP

Topik ini menunjukkan cara memigrasikan kode Anda untuk menggunakan versi 3 AWS SDK for PHP dan bagaimana versi baru berbeda dari versi 2. SDK

catatan

Pola penggunaan dasar SDK (yaitu,$result = $client->operation($params);) tidak berubah dari versi 2 ke versi 3, yang akan menghasilkan migrasi yang lancar.

Pengantar

Versi 3 AWS SDK for PHP mewakili upaya yang signifikan untuk meningkatkan kemampuanSDK, menggabungkan lebih dari dua tahun umpan balik pelanggan, meningkatkan dependensi kami, meningkatkan kinerja, dan mengadopsi standar terbaruPHP.

Apa yang baru di versi 3?

Versi 3 AWS SDK for PHP mengikuti standar PSR -4 dan PSR -7 dan akan mengikuti SemVerstandar ke depan.

Fitur baru lainnya termasuk

  • Sistem middleware untuk menyesuaikan perilaku klien layanan

  • Paginator fleksibel untuk iterasi melalui hasil paginasi

  • Kemampuan untuk menanyakan data dari objek hasil dan paginator dengan JMESPath

  • Debugging mudah melalui opsi 'debug' konfigurasi

Lapisan terpisah HTTP

  • Guzzle 6 digunakan secara default untuk mengirim permintaan, tetapi Guzzle 5 juga didukung.

  • SDKAkan bekerja di lingkungan di mana c URL tidak tersedia.

  • HTTPPenangan khusus juga didukung.

Permintaan asinkron

  • Fitur seperti pelayan dan pengunggah multibagian juga dapat digunakan secara asinkron.

  • Alur kerja asinkron dapat dibuat menggunakan janji dan coroutine.

  • Kinerja permintaan bersamaan atau batch ditingkatkan.

Apa yang berbeda dari versi 2?

Dependensi Proyek Diperbarui

Ketergantungan SDK telah berubah dalam versi ini.

  • SDKSekarang membutuhkan PHP 5.5+. Kami menggunakan generator secara bebas dalam kode. SDK

  • Kami telah memutakhirkan SDK untuk menggunakan Guzzle 6 (atau 5), yang menyediakan implementasi HTTP klien yang mendasari yang digunakan oleh SDK untuk mengirim permintaan ke layanan. AWS Versi terbaru Guzzle membawa serta sejumlah perbaikan, termasuk permintaan asinkron, penangan yang dapat ditukarHTTP, kepatuhan PSR -7, kinerja yang lebih baik, dan banyak lagi.

  • Paket PSR -7 dari PHP - FIG (psr/http-message) mendefinisikan antarmuka untuk mewakili HTTP permintaan, HTTP tanggapanURLs, dan aliran. Antarmuka ini digunakan di seluruh SDK dan Guzzle, yang menyediakan interoperabilitas dengan paket lain PSR yang sesuai -7.

  • Implementasi PSR -7 Guzzle (guzzlehttp/psr7) menyediakan implementasi antarmuka di PSR -7, dan beberapa kelas dan fungsi yang bermanfaat. Baik SDK dan Guzzle 6 sangat bergantung pada paket ini.

  • Implementasi Promises/A+ Guzzle (guzzlehttp/promises) digunakan di seluruh SDK dan Guzzle untuk menyediakan antarmuka untuk mengelola permintaan dan coroutine asinkron. Sementara URL HTTP handler multi-c Guzzle pada akhirnya mengimplementasikan model I/O non-blocking yang memungkinkan permintaan asinkron, paket ini menyediakan kemampuan untuk memprogram dalam paradigma itu. Lihat Janji di AWS SDK for PHP Versi 3 untuk lebih jelasnya.

  • PHPImplementasi JMESPath(mtdowling/jmespath.php) digunakan dalam SDK untuk menyediakan kemampuan query data dari Aws\Result::search() dan Aws\ResultPaginator::search() metode. Lihat JMESPathEkspresi di AWS SDK for PHP Versi 3 untuk detail selengkapnya.

Opsi Wilayah dan Versi Sekarang Diperlukan

Saat membuat instance klien untuk layanan apa pun, tentukan 'region' dan 'version' opsi. Dalam versi 2 AWS SDK for PHP, 'version' sepenuhnya opsional, dan 'region' terkadang opsional. Di versi 3, keduanya selalu diperlukan. Menjadi eksplisit tentang kedua opsi ini memungkinkan Anda untuk mengunci API versi dan AWS Wilayah yang Anda kodekan. Ketika API versi baru dibuat atau AWS Wilayah baru tersedia, Anda akan diisolasi dari perubahan yang berpotensi melanggar hingga Anda siap untuk memperbarui konfigurasi Anda secara eksplisit.

catatan

Jika Anda tidak khawatir tentang API versi mana yang Anda gunakan, Anda bisa mengatur 'version' opsi ke'latest'. Namun, kami menyarankan Anda mengatur nomor API versi secara eksplisit untuk kode produksi.

Tidak semua layanan tersedia di semua AWS Wilayah. Anda dapat menemukan daftar Wilayah yang tersedia menggunakan referensi Wilayah dan Titik Akhir.

Untuk layanan yang hanya tersedia melalui satu titik akhir global (misalnya, Amazon Route 53, dan Amazon CloudFront) AWS Identity and Access Management, buat instance klien dengan Wilayah yang dikonfigurasi disetel ke. us-east-1

penting

Ini SDK juga mencakup klien multi-wilayah, yang dapat mengirimkan permintaan ke AWS Wilayah yang berbeda berdasarkan parameter (@region) yang disediakan sebagai parameter perintah. Wilayah yang digunakan secara default oleh klien ini ditentukan dengan region opsi yang diberikan ke konstruktor klien.

Instantiasi Klien Menggunakan Konstruktor

Di versi 3 AWS SDK for PHP, cara Anda membuat instance klien telah berubah. Alih-alih factory metode di versi 2, Anda cukup membuat instance klien dengan menggunakan kata kunci. new

use Aws\DynamoDb\DynamoDbClient; // Version 2 style $client = DynamoDbClient::factory([ 'region' => 'us-east-2' ]); // Version 3 style $client = new DynamoDbClient([ 'region' => 'us-east-2', 'version' => '2012-08-10' ]);
catatan

Membuat instance klien menggunakan factory() metode ini masih berfungsi. Namun, itu dianggap usang.

Konfigurasi Klien Telah Berubah

Opsi konfigurasi klien di versi 3 AWS SDK for PHP telah berubah sedikit dari versi 2. Lihat halaman Konfigurasi untuk AWS SDK for PHP Versi 3 untuk deskripsi semua opsi yang didukung.

penting

Di versi 3, 'key' dan 'secret' bukan lagi opsi yang valid di tingkat root, tetapi Anda dapat meneruskannya sebagai bagian dari 'credentials' opsi. Salah satu alasan kami membuat ini adalah untuk mencegah pengembang dari hard-coding AWS kredensional mereka ke dalam proyek mereka.

Objek Sdk

Versi 3 AWS SDK for PHP memperkenalkan Aws\Sdk objek sebagai pengganti. Aws\Common\Aws SdkObjek bertindak sebagai pabrik klien dan digunakan untuk mengelola opsi konfigurasi bersama di beberapa klien.

Meskipun Aws kelas di versi 2 SDK bekerja seperti pencari lokasi layanan (selalu mengembalikan instance klien yang sama), Sdk kelas di versi 3 mengembalikan instance baru klien setiap kali digunakan.

SdkObjek juga tidak mendukung format file konfigurasi yang sama dari versi 2 fileSDK. Format konfigurasi itu khusus untuk Guzzle 3 dan sekarang sudah usang. Konfigurasi dapat dilakukan lebih sederhana dengan array dasar, dan didokumentasikan dalam Menggunakan Kelas Sdk.

Beberapa API Hasil Telah Berubah

Untuk memberikan konsistensi dalam cara SDK mem-parsing hasil API operasi, Amazon, Amazon ElastiCacheRDS, dan Amazon Redshift sekarang memiliki elemen pembungkus tambahan pada beberapa tanggapan. API

Misalnya, memanggil RDS DescribeEngineDefaultParametershasil Amazon di versi 3 sekarang menyertakan elemen “EngineDefaults” pembungkus. Dalam versi 2, elemen ini tidak ada.

$client = new Aws\Rds\RdsClient([ 'region' => 'us-west-1', 'version' => '2014-09-01' ]); // Version 2 $result = $client->describeEngineDefaultParameters(); $family = $result['DBParameterGroupFamily']; $marker = $result['Marker']; // Version 3 $result = $client->describeEngineDefaultParameters(); $family = $result['EngineDefaults']['DBParameterGroupFamily']; $marker = $result['EngineDefaults']['Marker'];

Operasi berikut terpengaruh dan sekarang berisi elemen pembungkus dalam output hasil (disediakan di bawah dalam tanda kurung):

  • Amazon ElastiCache

    • AuthorizeCacheSecurityGroupIngress (CacheSecurityGroup)

    • CopySnapshot (Cuplikan)

    • CreateCacheCluster (CacheCluster)

    • CreateCacheParameterGroup (CacheParameterGroup)

    • CreateCacheSecurityGroup (CacheSecurityGroup)

    • CreateCacheSubnetGroup (CacheSubnetGroup)

    • CreateReplicationGroup (ReplicationGroup)

    • CreateSnapshot (Cuplikan)

    • DeleteCacheCluster (CacheCluster)

    • DeleteReplicationGroup (ReplicationGroup)

    • DeleteSnapshot (Cuplikan)

    • DescribeEngineDefaultParameters (EngineDefaults)

    • ModifyCacheCluster (CacheCluster)

    • ModifyCacheSubnetGroup (CacheSubnetGroup)

    • ModifyReplicationGroup (ReplicationGroup)

    • PurchaseReservedCacheNodesOffering (ReservedCacheNode)

    • RebootCacheCluster (CacheCluster)

    • RevokeCacheSecurityGroupIngress (CacheSecurityGroup)

  • Amazon RDS

    • AddSourceIdentifierToSubscription (EventSubscription)

    • A uthorizeDBSecurity GroupIngress (DBSecurityGroup)

    • opyDBParameterGrup C (DBParameterGroup)

    • C opyDBSnapshot (DBSnapshot)

    • CopyOptionGroup (OptionGroup)

    • C reateDBInstance (DBInstance)

    • C reateDBInstance ReadReplica (DBInstance)

    • reateDBParameterGrup C (DBParameterGroup)

    • reateDBSecurityGrup C (DBSecurityGroup)

    • C reateDBSnapshot (DBSnapshot)

    • reateDBSubnetGrup C (DBSubnetGroup)

    • CreateEventSubscription (EventSubscription)

    • CreateOptionGroup (OptionGroup)

    • D eleteDBInstance (DBInstance)

    • D eleteDBSnapshot (DBSnapshot)

    • DeleteEventSubscription (EventSubscription)

    • DescribeEngineDefaultParameters (EngineDefaults)

    • M odifyDBInstance (DBInstance)

    • odifyDBSubnetGrup M (DBSubnetGroup)

    • ModifyEventSubscription (EventSubscription)

    • ModifyOptionGroup (OptionGroup)

    • PromoteReadReplica (DBInstance)

    • PurchaseReservedDBInstancesOffering(ReservedDBInstance)

    • R ebootDBInstance (DBInstance)

    • RemoveSourceIdentifierFromSubscription (EventSubscription)

    • R estoreDBInstance F romDBSnapshot (DBInstance)

    • R estoreDBInstance ToPointInTime (DBInstance)

    • R evokeDBSecurity GroupIngress (DBSecurityGroup)

  • Amazon Redshift

    • AuthorizeClusterSecurityGroupIngress (ClusterSecurityGroup)

    • AuthorizeSnapshotAccess (Cuplikan)

    • CopyClusterSnapshot (Cuplikan)

    • CreateCluster (Kluster)

    • CreateClusterParameterGroup (ClusterParameterGroup)

    • CreateClusterSecurityGroup (ClusterSecurityGroup)

    • CreateClusterSnapshot (Cuplikan)

    • CreateClusterSubnetGroup (ClusterSubnetGroup)

    • CreateEventSubscription (EventSubscription)

    • CreateHsmClientCertificate (HsmClientCertificate)

    • CreateHsmConfiguration (HsmConfiguration)

    • DeleteCluster (Kluster)

    • DeleteClusterSnapshot (Cuplikan)

    • DescribeDefaultClusterParameters (DefaultClusterParameters)

    • DisableSnapshotCopy (Kluster)

    • EnableSnapshotCopy (Kluster)

    • ModifyCluster (Kluster)

    • ModifyClusterSubnetGroup (ClusterSubnetGroup)

    • ModifyEventSubscription (EventSubscription)

    • ModifySnapshotCopyRetentionPeriod (Kluster)

    • PurchaseReservedNodeOffering (ReservedNode)

    • RebootCluster (Kluster)

    • RestoreFromClusterSnapshot (Kluster)

    • RevokeClusterSecurityGroupIngress (ClusterSecurityGroup)

    • RevokeSnapshotAccess (Cuplikan)

    • RotateEncryptionKey (Kluster)

Kelas Enum Telah Dihapus

Kami telah menghapus Enum kelas (misalnya,Aws\S3\Enum\CannedAcl) yang ada di versi 2 AWS SDK for PHP. Enum adalah kelas konkret dalam publik API yang berisi konstanta SDK yang mewakili kelompok nilai parameter yang valid. Karena enum ini khusus untuk API versi, dapat berubah seiring waktu, dapat bertentangan dengan kata-kata yang PHP dicadangkan, dan akhirnya tidak terlalu berguna, kami telah menghapusnya di versi 3. Ini mendukung sifat agnostik berbasis data dan API versi versi 3.

Alih-alih menggunakan nilai dari Enum objek, gunakan nilai literal secara langsung (misalnya, CannedAcl::PUBLIC_READ'public-read').

Kelas Pengecualian Berbutir Halus Telah Dihapus

Kami telah menghapus kelas pengecualian berbutir halus yang ada di ruang nama setiap layanan (misalnya,Aws\Rds\Exception\{SpecificError}Exception) untuk alasan yang sangat mirip ketika kami menghapus Enum. Pengecualian yang dilemparkan oleh layanan atau operasi tergantung pada API versi mana yang digunakan (mereka dapat berubah dari versi ke versi). Juga, daftar lengkap pengecualian yang dapat dilemparkan oleh operasi tertentu tidak tersedia, yang membuat kelas pengecualian berbutir halus versi 2 tidak lengkap.

Menangani kesalahan dengan menangkap kelas pengecualian root untuk setiap layanan (misalnya,Aws\Rds\Exception\RdsException). Anda dapat menggunakan getAwsErrorCode() metode pengecualian untuk memeriksa kode kesalahan tertentu. Ini secara fungsional setara dengan menangkap kelas pengecualian yang berbeda, tetapi menyediakan fungsi itu tanpa menambahkan bloat ke. SDK

Kelas Fasad Statis Telah Dihapus

Di versi 2 AWS SDK for PHP, ada fitur tidak jelas yang terinspirasi oleh Laravel yang memungkinkan Anda memanggil enableFacades() Aws kelas untuk mengaktifkan akses statis ke berbagai klien layanan. Fitur ini bertentangan dengan praktik PHP terbaik, dan kami berhenti mendokumentasikannya lebih dari setahun yang lalu. Di versi 3, fitur ini dihapus sepenuhnya. Ambil objek klien Anda dari Aws\Sdk objek dan gunakan sebagai instance objek, bukan kelas statis.

Paginator Menggantikan iterator

Versi 2 AWS SDK for PHP memiliki fitur bernama * iterators*. Ini adalah objek yang digunakan untuk mengulangi hasil paginasi. Satu keluhan yang kami miliki tentang ini adalah bahwa mereka tidak cukup fleksibel, karena iterator hanya memancarkan nilai tertentu dari setiap hasil. Jika ada nilai lain yang Anda butuhkan dari hasil, Anda hanya dapat mengambilnya melalui pendengar acara.

Di versi 3, iterator telah diganti dengan Paginator. Tujuan mereka serupa, tetapi paginator lebih fleksibel. Ini karena mereka menghasilkan objek hasil alih-alih nilai dari respons.

Contoh berikut menunjukkan bagaimana paginator berbeda dari iterator, dengan mendemonstrasikan cara mengambil hasil paginasi untuk S3 ListObjects operasi di versi 2 dan versi 3.

// Version 2 $objects = $s3Client->getIterator('ListObjects', ['Bucket' => 'amzn-s3-demo-bucket']); foreach ($objects as $object) { echo $object['Key'] . "\n"; }
// Version 3 $results = $s3Client->getPaginator('ListObjects', ['Bucket' => 'amzn-s3-demo-bucket']); foreach ($results as $result) { // You can extract any data that you want from the result. foreach ($result['Contents'] as $object) { echo $object['Key'] . "\n"; } }

Objek Paginator memiliki search() metode yang memungkinkan Anda untuk menggunakan JMESPathekspresi untuk mengekstrak data lebih mudah dari set hasil.

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

getIterator()Metode ini masih didukung untuk memungkinkan transisi yang mulus ke versi 3, tetapi kami mendorong Anda untuk memigrasikan kode Anda untuk menggunakan paginator.

Banyak Abstraksi Tingkat Tinggi Telah Berubah

Secara umum, banyak abstraksi tingkat yang lebih tinggi (objek pembantu khusus layanan, selain dari klien) telah ditingkatkan atau diperbarui. Beberapa bahkan telah dihapus.

Membandingkan Sampel Kode dari Kedua Versi SDK

Contoh berikut menunjukkan beberapa cara di mana menggunakan versi 3 AWS SDK for PHP mungkin berbeda dari versi 2.

Contoh: Operasi Amazon S3 ListObjects

Dari versi 2 dari SDK

<?php require '/path/to/vendor/autoload.php'; use Aws\S3\S3Client; use Aws\S3\Exception\S3Exception; $s3 = S3Client::factory([ 'profile' => 'my-credential-profile', 'region' => 'us-east-1' ]); try { $result = $s3->listObjects([ 'Bucket' => 'amzn-s3-demo-bucket', 'Key' => 'my-object-key' ]); foreach ($result['Contents'] as $object) { echo $object['Key'] . "\n"; } } catch (S3Exception $e) { echo $e->getMessage() . "\n"; }

Dari versi 3 dari SDK

Perbedaan utama:

  • Gunakan new alih-alih factory() untuk membuat instance klien.

  • 'region'Opsi 'version' dan diperlukan selama instantiasi.

<?php require '/path/to/vendor/autoload.php'; use Aws\S3\S3Client; use Aws\S3\Exception\S3Exception; $s3 = new S3Client([ 'profile' => 'my-credential-profile', 'region' => 'us-east-1', 'version' => '2006-03-01' ]); try { $result = $s3->listObjects([ 'Bucket' => 'amzn-s3-demo-bucket', 'Key' => 'my-object-key' ]); foreach ($result['Contents'] as $object) { echo $object['Key'] . "\n"; } } catch (S3Exception $e) { echo $e->getMessage() . "\n"; }

Contoh: Membuat Instantiasi Klien dengan Konfigurasi global

Dari versi 2 dari SDK

<?php return array( 'includes' => array('_aws'), 'services' => array( 'default_settings' => array( 'params' => array( 'profile' => 'my_profile', 'region' => 'us-east-1' ) ), 'dynamodb' => array( 'extends' => 'dynamodb', 'params' => array( 'region' => 'us-west-2' ) ), ) );
<?php require '/path/to/vendor/autoload.php'; use Aws\Common\Aws; $aws = Aws::factory('path/to/my/config.php'); $sqs = $aws->get('sqs'); // Note: SQS client will be configured for us-east-1. $dynamodb = $aws->get('dynamodb'); // Note: DynamoDB client will be configured for us-west-2.

Dari versi 3 dari SDK

Perbedaan utama:

  • Gunakan Aws\Sdk kelas sebagai gantiAws\Common\Aws.

  • Tidak ada file konfigurasi. Gunakan array untuk konfigurasi sebagai gantinya.

  • 'version'Opsi ini diperlukan selama instantiasi.

  • Gunakan create<Service>() metode alih-alihget('<service>').

<?php require '/path/to/vendor/autoload.php'; $sdk = new Aws\Sdk([ 'profile' => 'my_profile', 'region' => 'us-east-1', 'version' => 'latest', 'DynamoDb' => [ 'region' => 'us-west-2', ], ]); $sqs = $sdk->createSqs(); // Note: Amazon SQS client will be configured for us-east-1. $dynamodb = $sdk->createDynamoDb(); // Note: DynamoDB client will be configured for us-west-2.