Upgrade von Version 2 der AWS SDK for PHP - AWS SDK for PHP

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Upgrade von Version 2 der AWS SDK for PHP

In diesem Thema erfahren Sie, wie Sie Ihren Code zur Verwendung von Version 3 von migrieren AWS SDK for PHP und wie sich die neue Version von Version 2 von unterscheidetSDK.

Anmerkung

Das grundlegende Nutzungsmuster von SDK (d. h.,$result = $client->operation($params);) hat sich von Version 2 auf Version 3 nicht geändert, was zu einer reibungslosen Migration führen sollte.

Einführung

Version 3 von AWS SDK for PHP stellt eine erhebliche Anstrengung dar, um die Funktionen von zu verbessernSDK, Kundenfeedback aus mehr als zwei Jahren einzubeziehen, unsere Abhängigkeiten zu erweitern, die Leistung zu verbessern und die neuesten PHP Standards zu übernehmen.

Was ist neu in Version 3?

Version 3 von AWS SDK for PHP folgt den Standards PSR -4 und PSR -7 und wird auch in Zukunft dem SemVerStandard folgen.

Zu den weiteren neuen Funktionen zählen:

  • Middleware-System zum Anpassen des Service-Client-Verhaltens

  • Flexible Umbrüche zum Durchlaufen paginierter Ergebnisse

  • Fähigkeit, Daten aus Ergebnis - und Paginator-Objekten abzufragen mit JMESPath

  • Einfache Fehlersuche über die 'debug'-Konfigurationsoption

Entkoppelte Ebene HTTP

  • Standardmäßig wird Guzzle 6 zum Senden von Anforderungen verwendet, aber Guzzle 5 wird ebenfalls unterstützt.

  • Das SDK funktioniert in Umgebungen, in denen c nicht URL verfügbar ist.

  • Benutzerdefinierte HTTP Handler werden ebenfalls unterstützt.

Asynchrone Anfragen

  • Funktionen wie Waiter und mehrteilige Uploads können ebenfalls asynchron verwendet werden.

  • Asynchrone Workflows können mithilfe von Promises und Co-Routinen erstellt werden.

  • Die Performance von gleichzeitigen oder im Stapel verarbeiteten Anfragen wurde verbessert.

Was sind die Unterschiede gegenüber Version 2?

Projektabhängigkeiten wurden aktualisiert

Die Abhängigkeiten von SDK haben sich in dieser Version geändert.

  • Das benötigt SDK jetzt PHP 5.5+. Wir verwenden Generatoren großzügig innerhalb des Codes. SDK

  • Wir haben das aktualisiertSDK, um Guzzle 6 (oder 5) zu verwenden, das die zugrunde liegende HTTP Client-Implementierung bereitstellt, mit der Anfragen SDK an die AWS Dienste gesendet werden. Die neueste Version von Guzzle bringt eine Reihe von Verbesserungen mit sich, darunter asynchrone Anfragen, austauschbare HTTP Handler, PSR -7-Konformität, bessere Leistung und mehr.

  • Das Paket PSR -7 aus der Datei PHP - FIG (psr/http-message) definiert Schnittstellen zur Darstellung von HTTP Anfragen, Antworten und Streams. HTTP URLs Diese Schnittstellen werden überall in Guzzle SDK und Guzzle verwendet, wodurch die Interoperabilität mit anderen PSR -7-kompatiblen Paketen gewährleistet ist.

  • Die PSR -7-Implementierung (guzzlehttp/psr7) von Guzzle bietet eine Implementierung der Schnittstellen in PSR -7 sowie mehrere hilfreiche Klassen und Funktionen. Sowohl Guzzle 6 als SDK auch Guzzle 6 verlassen sich stark auf dieses Paket.

  • Die Promises/A+-Implementierung (guzzlehttp/promises) von Guzzle wird überall in Guzzle verwendet, um Schnittstellen für die SDK Verwaltung asynchroner Anfragen und Coroutinen bereitzustellen. Während der URL HTTP Multi-C-Handler von Guzzle letztlich das blockierungsfreie I/O-Modell implementiert, das asynchrone Anfragen ermöglicht, bietet dieses Paket die Möglichkeit, innerhalb dieses Paradigmas zu programmieren. Weitere Informationen finden Sie unter Versprechen in der AWS SDK for PHP Version 3.

  • Die PHP Implementierung von JMESPath(mtdowling/jmespath.php) wird verwendetSDK, um die Datenabfragefähigkeit der Aws\ResultPaginator::search() Methoden Aws\Result::search() und bereitzustellen. Weitere Informationen finden Sie unter JMESPathAusdrücke in AWS SDK for PHP Version 3.

Regions- und Versionsoptionen sind jetzt erforderlich

Bei der Instanziierung eines Clients für beliebige Services müssen Sie die Optionen 'region' und 'version' angeben. In Version 2 von 'version' war AWS SDK for PHP, völlig optional und 'region' war manchmal optional. In Version 3 sind beide immer erforderlich. Wenn Sie beide Optionen explizit angeben, können Sie sich auf die API Version und AWS Region festlegen, für die Sie programmieren. Wenn neue API Versionen erstellt werden oder neue AWS Regionen verfügbar werden, sind Sie vor potenziell schwerwiegenden Änderungen geschützt, bis Sie bereit sind, Ihre Konfiguration explizit zu aktualisieren.

Anmerkung

Wenn Sie sich keine Gedanken darüber machen, welche API Version Sie verwenden, können Sie die 'version' Option einfach auf setzen'latest'. Wir empfehlen jedoch, dass Sie die API Versionsnummern explizit für den Produktionscode festlegen.

Nicht alle Dienste sind in allen AWS Regionen verfügbar. Eine Liste der verfügbaren Regionen finden Sie Regionen und Endpunkte.

Für Dienste, die nur über einen einzigen, globalen Endpunkt verfügbar sind (z. B. Amazon Route 53 und Amazon CloudFront) AWS Identity and Access Management, instanziieren Sie Clients mit der konfigurierten Region auf. us-east-1

Wichtig

Dazu gehören SDK auch Clients mit mehreren Regionen, die Anfragen auf der Grundlage eines Parameters (@region), der als Befehlsparameter bereitgestellt wird, an verschiedene AWS Regionen senden können. Die von diesen Clients standardmäßig verwendete Region wird mit der Option region angegeben, die dem Client-Konstruktor übergeben wird.

Client-Instanziierung verwendet den Konstruktor

In Version 3 von hat sich die Art und Weise AWS SDK for PHP, wie Sie einen Client instanziieren, geändert. Anstelle der factory-Methoden in Version 2, können Sie einen Client einfach mithilfe des Schlüsselworts new instanziieren.

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' ]);
Anmerkung

Das Instanziieren eines Clients mithilfe der factory()-Methode funktioniert weiterhin. Es gilt jedoch als veraltet.

Die Client-Konfiguration hat sich geändert

Die Client-Konfigurationsoptionen in Version 3 von AWS SDK for PHP haben sich gegenüber Version 2 geringfügig geändert. Eine Beschreibung aller unterstützten Optionen finden Sie auf der Seite Konfiguration für AWS SDK for PHP Version 3.

Wichtig

In Version 3 sind 'key' und 'secret' keine gültigen Optionen auf der Stammebene mehr, aber Sie können sie als Teil der 'credentials'-Option übergeben. Ein Grund, warum wir das gemacht haben, war, Entwickler davon abzuhalten, ihre AWS Anmeldeinformationen fest in ihren Projekten zu programmieren.

Das Sdk-Objekt

Version 3 von AWS SDK for PHP führt das Aws\Sdk Objekt als Ersatz für ein. Aws\Common\Aws Das Sdk-Objekt fungiert als Client-Factory und wird verwendet, um gemeinsame Konfigurationsoptionen für mehrere Clients zu verwalten.

Obwohl die Aws Klasse in Version 2 von wie ein Service Locator SDK funktionierte (sie gab immer dieselbe Instanz eines Clients zurück), gibt die Sdk Klasse in Version 3 bei jeder Verwendung eine neue Instanz eines Clients zurück.

Das Sdk Objekt unterstützt auch nicht dasselbe Konfigurationsdateiformat wie Version 2 von. SDK Dieses Konfigurationsformat war spezifisch für Guzzle 3 und ist jetzt veraltet. Die Konfiguration kann einfacher mit grundlegenden Arrays erfolgen und ist in Verwendung der Sdk-Klasse dokumentiert.

Einige API Ergebnisse haben sich geändert

Um eine einheitliche Art und Weise zu gewährleisten, wie das Ergebnis eines API Vorgangs SDK analysiert wird, verfügen Amazon ElastiCacheRDS, Amazon und Amazon Redshift jetzt bei einigen API Antworten über ein zusätzliches Wrapping-Element.

Zum Beispiel beinhaltet der Aufruf des RDS DescribeEngineDefaultParametersAmazon-Ergebnisses in Version 3 jetzt ein umschließendes „EngineDefaults“ -Element. In Version 2 war dieses Element nicht vorhanden.

$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'];

Die folgenden Operationen sind betroffen und enthalten jetzt ein Wrapping-Element in der Ausgabe des Ergebnisses (nachfolgend in Klammern gezeigt):

  • Amazon ElastiCache

    • AuthorizeCacheSecurityGroupIngress (CacheSecurityGroup)

    • CopySnapshot (Schnappschuss)

    • CreateCacheCluster (CacheCluster)

    • CreateCacheParameterGroup (CacheParameterGroup)

    • CreateCacheSecurityGroup (CacheSecurityGroup)

    • CreateCacheSubnetGroup (CacheSubnetGroup)

    • CreateReplicationGroup (ReplicationGroup)

    • CreateSnapshot (Schnappschuss)

    • DeleteCacheCluster (CacheCluster)

    • DeleteReplicationGroup (ReplicationGroup)

    • DeleteSnapshot (Schnappschuss)

    • DescribeEngineDefaultParameters (EngineDefaults)

    • ModifyCacheCluster (CacheCluster)

    • ModifyCacheSubnetGroup (CacheSubnetGroup)

    • ModifyReplicationGroup (ReplicationGroup)

    • PurchaseReservedCacheNodesOffering (ReservedCacheNode)

    • RebootCacheCluster (CacheCluster)

    • RevokeCacheSecurityGroupIngress (CacheSecurityGroup)

  • Amazon RDS

    • AddSourceIdentifierToSubscription (EventSubscription)

    • Ein uthorizeDBSecurity GroupIngress (DBSecurityGroup)

    • opyDBParameterC-Gruppe (DBParameterGroup)

    • C opyDBSnapshot (DBSnapshot)

    • CopyOptionGroup (OptionGroup)

    • C reateDBInstance (DBInstance)

    • C reateDBInstance ReadReplica (DBInstance)

    • reateDBParameterC-Gruppe (DBParameterGroup)

    • reateDBSecurityC-Gruppe (DBSecurityGroup)

    • C reateDBSnapshot (DBSnapshot)

    • reateDBSubnetC-Gruppe (DBSubnetGroup)

    • CreateEventSubscription (EventSubscription)

    • CreateOptionGroup (OptionGroup)

    • D eleteDBInstance (DBInstance)

    • D eleteDBSnapshot (DBSnapshot)

    • DeleteEventSubscription (EventSubscription)

    • DescribeEngineDefaultParameters (EngineDefaults)

    • M odifyDBInstance (DBInstance)

    • odifyDBSubnetM-Gruppe (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 (Schnappschuss)

    • CopyClusterSnapshot (Schnappschuss)

    • CreateCluster (Cluster)

    • CreateClusterParameterGroup (ClusterParameterGroup)

    • CreateClusterSecurityGroup (ClusterSecurityGroup)

    • CreateClusterSnapshot (Schnappschuss)

    • CreateClusterSubnetGroup (ClusterSubnetGroup)

    • CreateEventSubscription (EventSubscription)

    • CreateHsmClientCertificate (HsmClientCertificate)

    • CreateHsmConfiguration (HsmConfiguration)

    • DeleteCluster (Cluster)

    • DeleteClusterSnapshot (Schnappschuss)

    • DescribeDefaultClusterParameters (DefaultClusterParameters)

    • DisableSnapshotCopy (Cluster)

    • EnableSnapshotCopy (Cluster)

    • ModifyCluster (Cluster)

    • ModifyClusterSubnetGroup (ClusterSubnetGroup)

    • ModifyEventSubscription (EventSubscription)

    • ModifySnapshotCopyRetentionPeriod (Cluster)

    • PurchaseReservedNodeOffering (ReservedNode)

    • RebootCluster (Cluster)

    • RestoreFromClusterSnapshot (Cluster)

    • RevokeClusterSecurityGroupIngress (ClusterSecurityGroup)

    • RevokeSnapshotAccess (Schnappschuss)

    • RotateEncryptionKey (Cluster)

Aufzählungsklassen wurden entfernt

Wir haben die Enum-Klassen entfernt (z. B. Aws\S3\Enum\CannedAcl), die es in Version 2 des AWS SDK for PHP gab. Enums waren konkrete Klassen innerhalb der Öffentlichkeit API von, die Konstanten enthieltenSDK, die Gruppen gültiger Parameterwerte repräsentierten. Da diese Aufzählungen versionsspezifisch sind, sich im Laufe der Zeit ändern können, Konflikte mit PHP reservierten Wörtern verursachen können und sich letztlich als nicht sehr nützlich erwiesen haben, haben wir sie in API Version 3 entfernt. Dies unterstützt den datengesteuerten und API versionsunabhängigen Charakter von Version 3.

Verwenden Sie anstelle von Werten aus Enum-Objekten direkt die literalen Werte (z. B. CannedAcl::PUBLIC_READ'public-read').

Differenzierte Ausnahmeklassen wurden entfernt

Wir haben die differenzierten Ausnahmeklassen entfernt, die es in den Namespaces jedes Services gab (zum Beispiel Aws\Rds\Exception\{SpecificError}Exception). Die Gründe dafür sind sehr ähnlich denjenigen, aus denen wir Enums entfernt haben. Die von einem Dienst oder einer Operation ausgelösten Ausnahmen hängen davon ab, welche API Version verwendet wird (sie können sich von Version zu Version ändern). Außerdem ist die vollständige Liste der Ausnahmen, die durch eine bestimmte Operation ausgegeben werden können, nicht verfügbar, wodurch die differenzierten Ausnahmeklassen der Version 2 unvollständig wurden.

Verarbeiten Sie Fehler, indem Sie die Root-Ausnahmeklasse für jeden Service abfangen (z. B. Aws\Rds\Exception\RdsException). Sie können die getAwsErrorCode()-Methode der Ausnahme verwenden, um auf bestimmte Fehlercodes zu prüfen. Dies entspricht funktionell dem Abfangen verschiedener Ausnahmeklassen, bietet diese Funktion jedoch, ohne die Datei zu überladen. SDK

Statische Fassadenklassen wurden entfernt

In Version 2 von gab es eine obskure AWS SDK for PHP, von Laravel inspirierte Funktion, mit der Sie die Aws Klasse aufrufen konnten, um den statischen Zugriff enableFacades() auf die verschiedenen Service-Clients zu aktivieren. Diese Funktion widerspricht den PHP bewährten Methoden, und wir haben vor über einem Jahr aufgehört, sie zu dokumentieren. In Version 3 wurde diese Funktion vollständig entfernt. Rufen Sie Ihre Client-Objekte aus dem Aws\Sdk-Objekt ab und verwenden Sie sie als Objekt-Instances, nicht als statische Klassen.

Paginatoren ersetzen Iteratoren

Version 2 von AWS SDK for PHP hatte eine Funktion namens * Iterators*. Dies waren Objekte, die zur Iteration paginierter Ergebnisse verwendet wurden. Eine Beschwerde, die wir dazu hatten, war, dass sie nicht flexibel genug waren, da der Iterator nur bestimmte Werte von jedem Ergebnis ausgab. Wenn es andere Werte gab, die Sie aus den Ergebnissen brauchten, konnten Sie diese nur über Ereignis-Listener abrufen.

In Version 3 wurden Iteratoren durch Paginatoren ersetzt. Ihr Zweck ist ähnlich, aber Paginatoren sind viel flexibler. Dies liegt daran, dass sie Ergebnisobjekte anstelle von Werten aus einer Antwort liefern.

Die folgenden Beispiele zeigen, wie sich Paginatoren von Iteratoren unterscheiden, indem demonstriert wird, wie paginierte Ergebnisse für die S3 ListObjects-Operation in Version 2 und Version 3 abgerufen werden.

// 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"; } }

Paginator-Objekte verfügen über eine search() Methode, mit der Sie JMESPathAusdrücke verwenden können, um Daten einfacher aus der Ergebnismenge zu extrahieren.

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

Die getIterator()-Methode wird weiterhin unterstützt, damit ein reibungsloser Übergang zu Version 3 möglich ist, aber wir möchten Sie bitten, ab jetzt Paginatoren in Ihrem Code zu verwenden.

Viele übergeordnete Abstraktionen haben sich geändert

Generell wurden viele der übergeordneten Abstraktionen (neben den Clients auch Service-spezifische Helferobjekte) verbessert oder aktualisiert. Einige wurden sogar entfernt.

Vergleich von Codebeispielen aus beiden Versionen von SDK

Die folgenden Beispiele zeigen einige der Möglichkeiten, in denen sich die Verwendung von Version 3 von von Version 2 unterscheiden AWS SDK for PHP kann.

Beispiel: Amazon S3 ListObjects S3-Betrieb

Ab Version 2 des 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"; }

Ab Version 3 des SDK

Wichtigste Unterschiede:

  • Verwendung von new anstelle von factory() zur Instanziierung des Clients.

  • Die Optionen 'version' und 'region' sind bei der Instanziierung erforderlich.

<?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"; }

Beispiel: Instanziieren eines Clients mit globaler Konfiguration

Ab Version 2 des 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.

Ab Version 3 des SDK

Wichtigste Unterschiede:

  • Verwendung der Aws\Sdk-Klasse statt Aws\Common\Aws.

  • Es gibt keine Konfigurationsdatei. Verwenden Sie stattdessen ein Array für die Konfiguration.

  • Die Option 'version' ist bei der Instanziierung erforderlich.

  • Verwendung der create<Service>()-Methoden statt 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.