本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
從版本 2 升級 AWS SDK for PHP
本主題說明如何遷移程式碼以使用AWS SDK for PHP第 3 版,並說明新版本與開發套件第 2 版的差異。
注意
開發套件第 2 版的基本使用模式 (如 $result = $client->operation($params);
) 在第 3 版中並沒有變化,能讓使用者順利遷移版本。
簡介
我們在提升開發套件的功能方面投入許多心力,不僅將過去兩年的客戶意見回饋納入設計考量,亦升級相依性、改善效能,並採用最新的 PHP 標準,最終推出了AWS SDK for PHP第 3 版。
第 3 版有哪些最新功能?
第三版AWS SDK for PHP遵循 PSR-4 和 PSR-7 標準
其他新功能包括:
-
推出中介軟體系統,可用來自訂服務用戶端行為
-
彈性化的分頁程式,可讓使用者逐一查看分頁結果
-
能夠使用 JMESPath,從結果與分頁程式物件中查詢資料
-
藉由
'debug'
組態選項,即可輕鬆偵錯
分離式 HTTP 層級
-
依據預設,系統會使用 Guzzle 6
傳送請求,但亦支援 Guzzle 5。 -
系統將在無法使用 cURL 的環境中運作此開發套件。
-
亦支援自訂 HTTP 處理常式。
非同步請求
-
使用者亦可採用非同步的方式來執行等待程式與分段上傳程式等功能。
-
可以透過 promises 與 coroutines,建立非同步的工作流程。
-
並行請求或批次請求的效能有所改善。
與第 2 版的差異為何?
更新專案相依性
此版本的開發套件相依性有所變更。
-
開發套件現在需要 PHP 5.5+ 才能使用。除此之外,開發套件程式碼中亦大量地使用 generators
(產生器)。 -
我們已將 SDK 升級為使用 Guzzle 6
(或 5),它提供了 SDK 用於向AWS服務發送請求的基礎 HTTP 客戶端實現。Guzzle 的最新版本推出許多改良功能,包括非同步請求、可切換的 HTTP 處理常式、PSR-7 規範,以及更優異的效能等等。 -
來自 PHP-FIG (
psr/http-message
) 的 PSR-7 套件,成功定義了用來代表 HTTP 請求、HTTP 回應、URL 與串流的界面。這些界面可供開發套件與 Guzzle 使用,亦可與其他 PSR-7 合規套件保持互通性。 -
Guzzle 的 PSR-7 實作套件 (
guzzlehttp/psr7
) 提供了 PSR-7 中界面的實作,以及數種頗具助益的類別與函數。因此,不論是開發套件或是 Guzzle 6,都極度倚賴此套件。 -
軟體開發套件與 Guzzle 皆使用 Guzzle 推出的 Promises/A+
實作 ( guzzlehttp/promises
),以提供管理非同步請求和 coroutine 的界面。最終,Guzzle 的多重 cURL HTTP 處理器會實作非封鎖式 I/O 模型,允許非同步請求,且此套件可讓使用者在該模式中進行程式設計。有關更多詳細信息,請參閱AWS SDK for PHP版本 3 中的承諾。 -
開發套件會採用 PHP 推出的 JMESPath
實作 ( mtdowling/jmespath.php
),以供使用者查詢Aws\Result::search()
與Aws\ResultPaginator::search()
方法的資料。有關更多詳細信息,請參閱AWS SDK for PHP版本 3 中的 JMESPath 表達式。
即日起需指定區域與版本選項
當您將任何服務的用戶端執行個體化時,請指定 'region'
與 'version'
選項。在AWS SDK for PHP第 2 版中,'version'
屬於完全可選用的選項,而 'region'
僅在部分情況下為選用。然而在第 3 版中,上述兩個選項一律為必要選項。明確說明這兩個選項可讓您鎖定要編碼的 API 版本和AWS區域。建立新 API 版本或新AWS區域可供使用時,在您準備好明確更新組態之前,您將不會遭受潛在的破壞變更。
注意
如果您對使用中的 API 版本沒有疑慮,則僅需將 'version'
選項設為 'latest'
。不過,我們建議您明確地設定生產程式碼的 API 版本編號。
並非所有服務均在所有AWS地區提供。如需查詢可用區域的清單,請參考區域與端點。
對於只能透過單一全球端點 (例如 Amazon Route 53 和 AmazonCloudFront) 提供的服務AWS Identity and Access Management,請將us-east-1
其設定區域設定為的情況下實例化用戶端。
重要
SDK 也包含多區AWS域用戶端,可根據作為命令參數提供的參數 (@region
),將要求傳送至不同的區域。這些用戶端預設使用的區域是經由提供給用戶端建構函式的 region
選項加以指定。
使用建構函式進行用戶端執行個體化
AWS SDK for PHP第 3 版改變了執行個體化用戶端的方式。您僅需使用 factory
關鍵字,即可將用戶端執行個體化,不需再使用第 2 版的 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' ]);
注意
您依然可以使用 factory()
方法來執行個體化用戶端。不過,系統會將該方式視為已遭取代。
變更用戶端組態
AWS SDK for PHP第 3 版中的用戶端組態選項與第 2 版有些許差異。如需所有支援選項的說明,請參閱第 3 AWS SDK for PHP 版的組態頁面。
重要
在第 3 版的根層級中,'key'
與 'secret'
不再是有效的選項,但您可以將這兩個選項傳入 'credentials'
選項。我們這樣做的一個原因是阻止開發人員將他們的AWS憑據硬編碼到他們的項目中。
Sdk 物件
AWS SDK for PHP第 3 版引進了 Aws\Sdk
物件,以取代 Aws\Common\Aws
。系統會將 Sdk
物件做為用戶端 factory 使用,並採用該物件來管理多個用戶端的共用組態選項。
雖然軟體開發套件第 2 版的 Aws
類別是以類似服務定位器的方式進行運作 (該類別會一律傳回相同的用戶端執行個體),但第 3 版的 Sdk
類別每次都會傳回新的用戶端執行個體。
Sdk
物件亦不支援與軟體開發套件第 2 版相同的組態檔案格式。該組態格式為 Guzzle 3 專屬格式,目前已淘汰。使用基本陣列將能更輕鬆地進行組態,其做法詳載於使用 Sdk 類別。
變更部分 API 結果
為了提供 SDK 如何剖析 API 操作結果的一致性,亞馬遜ElastiCache、亞馬遜 RDS 和亞馬遜 Redshift 現在在某些 API 回應上有一個額外的包裝元素。
例如,在版本 3 中呼叫 Amazon RDS 會DescribeEngineDefaultParameters導致現在包含一個包裝「EngineDefaults」元素。然而在第 2 版中,此元素並不存在。
$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'];
下列操作在此版本中亦受到影響,因此這些操作目前在輸出結果中會納入包裝元素,如括號中所示:
-
Amazon ElastiCache
-
AuthorizeCacheSecurityGroupIngress (CacheSecurityGroup)
-
CopySnapshot(快照)
-
CreateCacheCluster (CacheCluster)
-
CreateCacheParameterGroup (CacheParameterGroup)
-
CreateCacheSecurityGroup (CacheSecurityGroup)
-
CreateCacheSubnetGroup (CacheSubnetGroup)
-
CreateReplicationGroup (ReplicationGroup)
-
CreateSnapshot(快照)
-
DeleteCacheCluster (CacheCluster)
-
DeleteReplicationGroup (ReplicationGroup)
-
DeleteSnapshot(快照)
-
DescribeEngineDefaultParameters (EngineDefaults)
-
ModifyCacheCluster (CacheCluster)
-
ModifyCacheSubnetGroup (CacheSubnetGroup)
-
ModifyReplicationGroup (ReplicationGroup)
-
PurchaseReservedCacheNodesOffering (ReservedCacheNode)
-
RebootCacheCluster (CacheCluster)
-
RevokeCacheSecurityGroupIngress (CacheSecurityGroup)
-
-
Amazon RDS
-
AddSourceIdentifierToSubscription (EventSubscription)
-
授權教育局 SecurityGroupIngress (資料庫) SecurityGroup
-
複製資料庫 ParameterGroup (資料庫ParameterGroup)
-
CopyDBSnapshot (DBSnapshot)
-
CopyOptionGroup (OptionGroup)
-
CreateDBInstance (DBInstance)
-
創建數據庫InstanceReadReplica(數據庫實例)
-
創建數據庫 ParameterGroup (DB) ParameterGroup
-
創建數據庫 SecurityGroup (DB) SecurityGroup
-
CreateDBSnapshot (DBSnapshot)
-
創建數據庫 SubnetGroup (DB) SubnetGroup
-
CreateEventSubscription (EventSubscription)
-
CreateOptionGroup (OptionGroup)
-
DeleteDBInstance (DBInstance)
-
DeleteDBSnapshot (DBSnapshot)
-
DeleteEventSubscription (EventSubscription)
-
DescribeEngineDefaultParameters (EngineDefaults)
-
ModifyDBInstance (DBInstance)
-
修改數據庫SubnetGroup(數據庫)SubnetGroup
-
ModifyEventSubscription (EventSubscription)
-
ModifyOptionGroup (OptionGroup)
-
PromoteReadReplica(資料庫執行個體)
-
PurchaseReserved資料庫 InstancesOffering (保留 DB 執行個體)
-
RebootDBInstance (DBInstance)
-
RemoveSourceIdentifierFromSubscription (EventSubscription)
-
恢復資料庫快照 (InstanceFrom資料庫例證)
-
復原 B (資料庫執行個體) InstanceToPointInTime
-
撤銷數據庫SecurityGroupIngress(數據庫)SecurityGroup
-
-
Amazon Redshift
-
AuthorizeClusterSecurityGroupIngress (ClusterSecurityGroup)
-
AuthorizeSnapshotAccess(快照)
-
CopyClusterSnapshot(快照)
-
CreateCluster(叢集)
-
CreateClusterParameterGroup (ClusterParameterGroup)
-
CreateClusterSecurityGroup (ClusterSecurityGroup)
-
CreateClusterSnapshot(快照)
-
CreateClusterSubnetGroup (ClusterSubnetGroup)
-
CreateEventSubscription (EventSubscription)
-
CreateHsmClientCertificate (HsmClientCertificate)
-
CreateHsmConfiguration (HsmConfiguration)
-
DeleteCluster(叢集)
-
DeleteClusterSnapshot(快照)
-
DescribeDefaultClusterParameters (DefaultClusterParameters)
-
DisableSnapshotCopy(叢集)
-
EnableSnapshotCopy(叢集)
-
ModifyCluster(叢集)
-
ModifyClusterSubnetGroup (ClusterSubnetGroup)
-
ModifyEventSubscription (EventSubscription)
-
ModifySnapshotCopyRetentionPeriod(叢集)
-
PurchaseReservedNodeOffering (ReservedNode)
-
RebootCluster(叢集)
-
RestoreFromClusterSnapshot(叢集)
-
RevokeClusterSecurityGroupIngress (ClusterSecurityGroup)
-
RevokeSnapshotAccess(快照)
-
RotateEncryptionKey(叢集)
-
移除 Enum 類別
我們已經移除AWS SDK for PHP第 2 版現存的 Enum
類別 (如 Aws\S3\Enum\CannedAcl
)。Enum 屬於開發套件公有 API 中的具體類別,而該類別所含的常數可用來表示有效參數值群組。由於這些 enum 是 API 版本特有的類別,可能會隨著時間改變,或是與 PHP 保留字衝突,致使降低效能且沒有任何助益;因此,我們決定在第 3 版中移除這些類別。如此一來,這項改變即可支援第 3 版的資料導向與 API 版本適用性。
您不該使用來自 Enum
物件的值,而是直接使用常值。例如:使用 CannedAcl::PUBLIC_READ
取代 'public-read'
。
移除微調例外類別
出於與移除 Enums 類別相似的考量,我們也一併移除了各服務命名空間中的精細例外狀況類別 (例如 Aws\Rds\Exception\{SpecificError}Exception
)。由於服務或操作會依據使用的 API 版本來擲出例外狀況,因此例外狀況會隨版本而異。不僅如此,系統亦無法使用指定操作所拋出的例外狀況完整清單,導致第 2 版的精細例外狀況類別無法完整呈現。
為了處理錯誤,您應該取得各項服務的例外根類別 (例如:Aws\Rds\Exception\RdsException
)。您可以使用例外狀況的 getAwsErrorCode()
方法,藉此檢查特定的錯誤碼。此功能相當於取得不同的例外類別,但本版本所提供的功能不會增加開發套件的膨脹速度。
移除靜態 Facade 類別
受到 Laravel 啟發,AWS SDK for PHP第 2 版搭載了一項隱藏功能,讓您可對 Aws
類別呼叫 enableFacades()
,以啟用各種服務用戶端的靜態存取。然而,這項功能並不符合 PHP 最佳實務。因此,我們在一年前便已經停止記錄該功能,而我們更是在第 3 版中完全將之移除。從 Aws\Sdk
物件中擷取用戶端物件,並將這些物件做為物件執行個體來使用,而非靜態類別。
以分頁程式取代疊代運算
AWS SDK for PHP第 2 版有一項稱為 *疊代運算* 的功能。系統會使用疊代運算物件來逐一查看分頁結果。使用者對這些物件感到不滿的原因之一便是「缺乏彈性」,因為疊代運算僅會發送每個結果的特定值。您只能透過事件接聽程式,才能擷取其他所需的結果值。
在第 3 版中,疊代運算已由分頁程式取代。兩種功能的用途十分相似,但分頁程式提供更多使用彈性。這是因為分頁程式會產生結果物件,而非擷取回應中的數值。
以下範例會示範第 2 版和第 3 版如何擷取 S3 ListObjects
操作的分頁結果,以便說明分頁程式與疊代運算之間的差異。
// Version 2 $objects = $s3Client->getIterator('ListObjects', ['Bucket' => 'my-bucket']); foreach ($objects as $object) { echo $object['Key'] . "\n"; }
// Version 3 $results = $s3Client->getPaginator('ListObjects', ['Bucket' => 'my-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"; } }
分頁程式物件的 search()
方法讓您能夠使用 JMESPath 表達式,更輕鬆地從結果集擷取資料。
$results = $s3Client->getPaginator('ListObjects', ['Bucket' => 'my-bucket']); foreach ($results->search('Contents[].Key') as $key) { echo $key . "\n"; }
注意
為了讓使用者順利轉移至第 3 版,該版本仍然支援 getIterator()
方法,但我們建議您遷移程式碼以使用分頁程式。
變更許多高階抽象概念
整體而言,此版本改良或更新了許多高階抽象概念 (除用戶端之外的服務特定 helper 物件);甚至移除部分高階抽象概念。
-
- 已更新:
-
-
Amazon S3 分段上傳的使用方式有所變更,亞馬遜 S3 冰川多部分上傳也以類似的方式進行了變更。
-
Amazon S3 預先簽章的 URL 建立方式有所變更。
-
採用
Aws\S3\Sync
類別來取代Aws\S3\Transfer
命名空間。您仍可使用S3Client::uploadDirectory()
與S3Client::downloadBucket()
方法,但選項會有所不同。請參閱使用第 3 AWS SDK for PHP 版的 Amazon S3 傳輸管理員相關文件。 -
採用
Aws\S3\Model\ClearBucket
與Aws\S3\Model\DeleteObjectsBatch
來取代Aws\S3\BatchDelete
和S3Client::deleteMatchingObjects()
。 -
在AWS SDK for PHP版本 3 中使用 DynamoDB 工作階段處理常式的選項和行為稍有變更。
-
採用
Aws\DynamoDb\Model\BatchRequest
來取代Aws\DynamoDb\WriteRequestBatch
命名空間。請參閱有關 DynamoDB WriteRequestBatch 的文件。 -
Aws\Ses\SesClient
現可在使用SendRawEmail
操作時處理 base64 以對RawMessage
進行編碼。
-
-
- 已移除:
-
-
亞馬遜 DynamoDB
Item
Attribute
、和ItemIterator
類別-這些類別先前已在 2.7.0 版中淘汰。 -
Amazon SNS 訊息驗證程式-這是一個單獨的輕量型專案,
不需要 SDK 作為相依性。然而,此專案會包含在開發套件的 Phar 與 ZIP 分發中。您可以在 AWSPHP 開發博客上找到 入門指南。 -
亞馬遜 S3
AcpBuilder
和相關對象已被刪除。
-
比較開發套件兩個版本的程式碼範例
以下範例顯示AWS SDK for PHP第 3 版與第 2 版的部分使用差異。
範例:亞馬遜 S3 ListObjects 操作
開發套件第 2 版操作
<?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' => 'my-bucket-name', 'Key' => 'my-object-key' ]); foreach ($result['Contents'] as $object) { echo $object['Key'] . "\n"; } } catch (S3Exception $e) { echo $e->getMessage() . "\n"; }
開發套件第 3 版操作
主要差異:
-
使用
new
將用戶端執行個體化,而非使用factory()
。 -
需要指定
'version'
與'region'
選項,才能執行個體化。
<?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' => 'my-bucket-name', 'Key' => 'my-object-key' ]); foreach ($result['Contents'] as $object) { echo $object['Key'] . "\n"; } } catch (S3Exception $e) { echo $e->getMessage() . "\n"; }
範例:使用全域組態將用戶端執行個體化
開發套件第 2 版操作
<?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.
開發套件第 3 版操作
主要差異:
-
使用
Aws\Sdk
類別,而不是Aws\Common\Aws
。 -
沒有組態檔案。但會使用組態陣列取而代之。
-
需要指定
'version'
選項,才能執行個體化。 -
使用
create<Service>()
方法,而不是get('<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.