AWS SDK for PHP版本 3 的常見問題 - AWS SDK for PHP

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

AWS SDK for PHP版本 3 的常見問題

在用戶端上可使用哪些方法?

AWS SDK for PHP使用服務描述和動態 magic __call() 方法以執行 API 操作。在用戶端的 API 文件中,提供了 web 服務用戶端可使用的方法完整清單。

我該如何處理 cURL SSL 憑證的錯誤?

搭配 cURL 和 SSL 使用out-of-date CA 服務包時,可能會發生這個問題。您可以通過更新服務器上的 CA 包或直接從 cURL 網站下載更多up-to-date CA 包來解決此問題。

預設情況下,AWS SDK for PHP將會使用編譯 PHP 時所設定的 CA 套件。您可透過修改 openssl.cafile PHP .ini 組態設定 (其將設為磁碟上 CA 檔案的路徑) 以變更 PHP 所使用的預設 CA 套件。

用戶端可使用哪些 API 版本?

在建立用戶端時必須設定 version 選項。可以在每個客戶端的 API 文檔頁面上找到可用 API 版本的列表:aws-php-class:: <index.html>。如果您無法載入特定的 API 版本,您可能需要更新您AWS SDK for PHP複本。

您可針對 “version” 組態值提供 latest 字串,以使用用戶端 API 提供者所能找到的最新可用 API 版本 (預設的 api_provider 將會掃描軟體開發套件的 src/data 目錄來尋找 API 模型)。

警告

我們不建議在生產應用程式中使用 latest,因為導入包含 API 更新的軟體開發套件小型更新版本,可能會中斷您的生產應用程式。

用戶端可使用哪些區域版本?

在建立用戶端時需要 region 選項,而此選項是使用字串值來指定。如需可用AWS區域和端點的清單,請參閱AWSAWS 一般參考.

// Set the Region to the EU (Frankfurt) Region. $s3 = new Aws\S3\S3Client([ 'region' => 'eu-central-1', 'version' => '2006-03-01' ]);

為什麼我無法上傳或下載大於 2 GB 的檔案?

由於 PHP 的整數類型帶有正負號,而許多平台使用 32 位元整數,在 32 位元的堆疊上,AWS SDK for PHP無法正確地處理大小超過 2 GB 的檔案 (「堆疊」包含 CPU、作業系統、web 伺服器和 PHP 二進位檔)。這是一項眾所皆知的 PHP 問題。如果是 Microsoft Windows,則只有 PHP 7 的版本支援 64 位元整數。

建議的解決方法是使用 64 位元 Linux 堆疊,例如 64 位元 Amazon Linux AMI,並且安裝最新版本的 PHP。

如需詳細資訊,請參閱 PHP 檔案大小:傳回的值

我要如何查看透過線路傳輸的資料內容?

您可以在用戶端建構函式中使用 debug 選項取得偵錯資訊,包括透過線路傳輸的資料內容。當此選項設為 true 時,正在執行的命令的所有不同變異版本、傳送的請求、接收的回應和處理的結果,都會發送到 STDOUT。這包括透過線路傳送和接收的資料。

$s3Client = new Aws\S3\S3Client([ 'region' => 'us-standard', 'version' => '2006-03-01', 'debug' => true ]);

我要如何在請求中設定任意標頭?

透過在 Aws\HandlerListAws\CommandInterfaceAws\ClientInterface 中加入自訂的中介軟體,您可以在服務操作中加入任何任意的標頭。下列範例顯示如何使用Aws\Middleware::mapRequest協助程式方法將X-Foo-Baz標頭新增至特定 Amazon S3PutObject 作業。

如需詳細資訊,請參閱 mapRequest

我要如何簽署任意請求?

您可以簽署一個任意的aws-php-class:: PSR-7 請求 < 類別。 RequestInterface.html> 使用開發套件的:aws-php-class: 簽名 v4 類別<class-Aws.Signature.SignatureV4.html>。

如需如何執行此操作的完整範例,請參閱使用AWS SDK for PHP版本 3 簽署自訂 AmazonCloudSearch 網域請求

我要如何在傳送命令之前先加以修改?

您可以藉由在 Aws\CommandInterfaceAws\ClientInterfaceAws\HandlerList 中加入自訂的中介軟體,在傳送前修改命令。以下範例示範如何在傳送命令之前,在命令中新增自訂的命令參數,這基本上就是新增預設的選項。此範例使用 Aws\Middleware::mapCommand helper 方法。

如需詳細資訊,請參閱 mapCommand

什麼是 CredentialsException?

如果在使用AWS SDK for PHP時出現 Aws\Exception\CredentialsException,代表軟體開發套件並未隨附任何登入資料,而且在環境中也找不到登入資料。

如果您在沒有登入資料的情況下進行用戶端的執行個體化,則當您第一次執行服務操作時,軟體開發套件將會試著找出登入資料。它會先檢查某些特定的環境變數,然後尋找執行個體設定檔登入資料,這些登入資料僅適用於已設定的 Amazon EC2 執行個體。如果完全找不到或未提供登入資料,會丟出 Aws\Exception\CredentialsException 例外。

如果您看到此錯誤,且打算使用執行個體設定檔登入資料,則需要確定執行該 SDK 的 Amazon EC2 執行個體已設定適當的 IAM 角色。

如果出現此項錯誤,而且您打算使用執行個體描述檔的登入資料,則您必須向軟體開發套件提供適當的登入資料。

如需詳細資訊,請參閱適用於第 3AWS SDK for PHP 版的認證

AWS SDK for PHP是否能在 HHVM 上運作?

AWS SDK for PHP目前無法在 HHVM 上執行,且 HHVM 中產生語意的問題尚未解決之前都將無法執行。

我要如何停用 SSL?

您可以藉由將用戶端工廠方法中的 scheme 參數設為 ‘http’,來停用 SSL。請務必注意,並非所有服務皆支援 http 存取。AWS 一般參考如需AWS區域、端點和支援配置的清單,請參閱中的區域和端點。

$client = new Aws\DynamoDb\DynamoDbClient([ 'version' => '2012-08-10', 'region' => 'us-west-2', 'scheme' => 'http' ]);
警告

由於 SSL 要求所有資料進行加密,而且需要更多的 TCP 封包來完成連線交握 (而不只是 TCP),因此停用 SSL 可能會小幅改善效能。不過,當 SSL 停用時,透過線路傳送的所有資料都不會加密。在停用 SSL 之前,您必須仔細地考慮潛在的安全問題,以及透過網路竊聽的可能性。

我該如何處理「剖析錯誤」?

在遇到不了解的語法時,PHP 引擎將會拋出剖析錯誤。在試圖執行針對不同版本 PHP 撰寫的程式碼時,幾乎都會遇到這種狀況。

如果您遇到剖析錯誤,請檢查您的系統,並確定它符合 SDK 對第 3AWS SDK for PHP 版的需求和建議

為什麼 Amazon S3 客戶端解壓縮壓縮文件?

某些 HTTP 處理常式 (包括預設的 Guzzle 6 HTTP 處理常式) 預設會將壓縮的回應內容解壓縮。您可以將 decode_content HTTP 選項設定為 false 覆寫此行為。基於回溯相容性,這項預設無法變更,但我們建議您在 S3 用戶端層級停用內容解碼。

如需如何停用自動內容解碼的範例,請參閱 decode_content

如何在 Amazon S3 中禁用正文簽名?

若要停用內文簽署,您可以將命令物件的 ContentSHA256 參數設為 Aws\Signature\S3SignatureV4::UNSIGNED_PAYLOAD。然後AWS SDK for PHP將其用作規範請求中的x-amz-content-sha '-256' 標題和正文校驗和。

$s3Client = new Aws\S3\S3Client([ 'version' => '2006-03-01', 'region' => 'us-standard' ]); $params = [ 'Bucket' => 'foo', 'Key' => 'baz', 'ContentSHA256' => Aws\Signature\S3SignatureV4::UNSIGNED_PAYLOAD ]; // Using operation methods creates command implicitly $result = $s3Client->putObject($params); // Using commands explicitly. $command = $s3Client->getCommand('PutObject', $params); $result = $s3Client->execute($command);

在AWS SDK for PHP中如何處理重試機制?

AWS SDK for PHP具備 RetryMiddleware 可處理重試行為。如果是伺服器錯誤的 5xx 系列 HTTP 狀態碼,軟體開發套件會針對 500、502、503 和 504 來進行重試。

調節例外狀況 (包括 RequestLimitExceededThrottlingProvisionedThroughputExceededExceptionThrottlingExceptionRequestThrottledBandwidthLimitExceeded) 也會重試。

AWS SDK for PHP也會在重試機制中,整合指數延遲與後退和抖動演算法。此外,除了 Amazon DynamoDB 之外,3所有服務的預設重試行為都會設定為10

我要如何處理具有錯誤碼的例外狀況?

除了AWS SDK for PHP-自定義Exception類,每個AWS服務客戶端都有自己的異常類繼承自AwsExceptionAwsException。根據在每項方法的 Errors 部分所列出的 API 特定錯誤,您可以判斷更多要捕捉 (catch) 的特定錯誤類型。

錯誤碼資訊可與來源的 getAwsErrorCode () 一起取得Aws\Exception\AwsException

$sns = new \Aws\Sns\SnsClient([ 'region' => 'us-west-2', 'version' => 'latest', ]); try { $sns->publish([ // parameters ... ]); // Do something } catch (SnsException $e) { switch ($e->getAwsErrorCode()) { case 'EndpointDisabled': case 'NotFound': // Do something break; } }