

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

# 第 3 適用於 PHP 的 AWS SDK 版常見問答集
<a name="faq"></a>

## 在用戶端上可使用哪些方法？
<a name="what-methods-are-available-on-a-client"></a>

 適用於 PHP 的 AWS SDK 使用服務描述和動態[魔術 \$1\$1call() 方法來](http://www.php.net/manual/en/language.oop5.overloading.php#object.call)執行 API 操作。在用戶端的 [API 文件](https://docs.aws.amazon.com/aws-sdk-php/v3/api/index.html)中，提供了 web 服務用戶端可使用的方法完整清單。

## 我該如何處理 cURL SSL 憑證的錯誤？
<a name="what-do-i-do-about-a-curl-ssl-certificate-error"></a>

如果使用過時的 CA 套件和 cURL 與 SSL，可能會發生此問題。您可以藉由更新伺服器上的 CA 套件，或是從 [cURL 網站直接](http://curl.haxx.se/docs/caextract.html)下載更新的 CA 套件，來解決此項問題。

根據預設， 適用於 PHP 的 AWS SDK 將使用編譯 PHP 時設定的 CA 套件。您可透過修改 `openssl.cafile` PHP .ini 組態設定 (其將設為磁碟上 CA 檔案的路徑) 以變更 PHP 所使用的預設 CA 套件。

## 用戶端可使用哪些 API 版本？
<a name="what-api-versions-are-available-for-a-client"></a>

在建立用戶端時必須設定 `version` 選項。在每個用戶端的 API 文件頁面 (::aws-php-class:<index.html>) 上，皆提供了可用 API 版本的清單。如果您無法載入特定的 API 版本，您可能需要更新您 適用於 PHP 的 AWS SDK複本。

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

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

## 用戶端可使用哪些區域版本？
<a name="what-region-versions-are-available-for-a-client"></a>

在建立用戶端時需要 `region` 選項，而此選項是使用字串值來指定。如需可用 AWS 區域和端點的清單，請參閱《》中的[AWS 區域和端點](https://docs.aws.amazon.com/general/latest/gr/rande.html) AWS 一般參考。

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

## 為什麼我無法上傳或下載大於 2 GB 的檔案？
<a name="why-can-t-i-upload-or-download-files-larger-than-2-gb"></a>

由於 PHP 的整數類型帶有正負號，而許多平台使用 32 位元整數，在 32 位元的堆疊上， 適用於 PHP 的 AWS SDK 無法正確地處理大小超過 2 GB 的檔案 (「堆疊」包含 CPU、作業系統、web 伺服器和 PHP 二進位檔)。這是一項[眾所皆知的 PHP 問題](http://www.google.com/search?q=php+2gb+32-bit)。如果是 Microsoft Windows，則只有 PHP 7 的版本支援 64 位元整數。

建議的解決方法是使用 [64 位元 Linux 堆疊](https://aws.amazon.com/amazon-linux-ami/)，例如 64 位元 Amazon Linux AMI，並且安裝最新版本的 PHP。

如需詳細資訊，請參閱 [PHP 檔案大小：傳回的值](http://docs.php.net/manual/en/function.filesize.php#refsect1-function.filesize-returnvalues)。

## 我要如何查看透過線路傳輸的資料內容？
<a name="how-can-i-see-what-data-is-sent-over-the-wire"></a>

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

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

## 我要如何在請求中設定任意標頭？
<a name="how-can-i-set-arbitrary-headers-on-a-request"></a>

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

如需詳細資訊，請參閱 [mapRequest](guide_handlers-and-middleware.md#map-request)。

## 我要如何簽署任意請求？
<a name="how-can-i-sign-an-arbitrary-request"></a>

您可以使用 SDK 的 ：aws-php-class： SignatureV4 class *<class-Aws.Signature.SignatureV4.html>，簽署任意 ：aws-php-class：PSR-7 請求 <class-Psr.Http.Message.RequestInterfaceRequestInterface.html>*.html>。 aws-php-class *SignatureV4 SignatureV4.html>*

如需如何執行此操作的完整範例，請參閱[使用第 3 適用於 PHP 的 AWS SDK 版簽署自訂 Amazon CloudSearch 網域請求](service_cloudsearch-custom-requests.md)。

## 我要如何在傳送命令之前先加以修改？
<a name="how-can-i-modify-a-command-before-sending-it"></a>

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

如需詳細資訊，請參閱 [mapCommand](guide_handlers-and-middleware.md#map-command)。

## 什麼是 CredentialsException？
<a name="what-is-a-credentialsexception"></a>

如果您在使用 `Aws\Exception\CredentialsException`時看到 適用於 PHP 的 AWS SDK，表示軟體開發套件未提供任何登入資料，而且無法在環境中找到登入資料。

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

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

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

如需詳細資訊，請參閱第 [3 適用於 PHP 的 AWS SDK 版的登入](guide_credentials.md)資料。

## 是否 適用於 PHP 的 AWS SDK 適用於 HHVM？
<a name="does-the-sdk-php-work-on-hhvm"></a>

目前 適用於 PHP 的 AWS SDK 不在 HHVM 上執行，而且在 [HHVM 中產生語意的問題](https://github.com/facebook/hhvm/issues/6807)解決之前， 將無法執行。

## 我要如何停用 SSL？
<a name="how-do-i-disable-ssl"></a>

您可以藉由將用戶端工廠方法中的 `scheme` 參數設為 ‘http’，來停用 SSL。請務必注意，並非所有服務皆支援 `http` 存取。如需[AWS 區域、端點和](https://docs.aws.amazon.com/general/latest/gr/rande.html)支援方案的 AWS 一般參考 清單，請參閱 中的區域和端點。

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

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

## 我該如何處理「剖析錯誤」？
<a name="what-do-i-do-about-a-parse-error"></a>

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

如果您遇到剖析錯誤，請檢查您的系統，並確定其符合 SDK [對第 3 適用於 PHP 的 AWS SDK 版的要求和建議](getting-started_requirements.md)。

## 為什麼 Amazon S3 用戶端解壓縮 gziped 檔案？
<a name="why-is-the-s3-client-decompressing-gzipped-files"></a>

某些 HTTP 處理常式 (包括預設的 Guzzle 6 HTTP 處理常式) 預設會將壓縮的回應內容解壓縮。您可以將 [decode\$1content](guide_configuration.md#http-decode-content) HTTP 選項設定為 `false` 覆寫此行為。基於回溯相容性，這項預設無法變更，但我們建議您在 S3 用戶端層級停用內容解碼。

如需如何停用自動內容解碼的範例，請參閱 [decode\$1content](guide_configuration.md#http-decode-content)。

## 如何在 Amazon S3 中停用內文簽署？
<a name="how-do-i-disable-body-signing-in-s3"></a>

若要停用內文簽署，您可以將命令物件的 `ContentSHA256` 參數設為 `Aws\Signature\S3SignatureV4::UNSIGNED_PAYLOAD`。然後， 適用於 PHP 的 AWS SDK 會將其用作正式請求中的「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);
```

## 在 適用於 PHP 的 AWS SDK中如何處理重試機制？
<a name="how-is-retry-scheme-handled-in-the-sdk-php"></a>

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

調節例外狀況 (包括 `RequestLimitExceeded`、`Throttling`、`ProvisionedThroughputExceededException`、`ThrottlingException`、`RequestThrottled` 和 `BandwidthLimitExceeded`) 也會重試。

 適用於 PHP 的 AWS SDK 也會將指數延遲與重試配置中的退避和抖動演算法整合。此外，除了 Amazon DynamoDB 之外`3`，所有服務的預設重試行為都會設定為 ，也就是 `10`。

## 我要如何處理具有錯誤碼的例外狀況？
<a name="how-do-i-handle-exceptions-with-error-codes"></a>

除了 適用於 PHP 的 AWS SDK自訂`Exception`類別之外，每個 AWS 服務用戶端都有自己的例外類別，繼承自 [AwsExceptionAwsException](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.Exception.AwsException.html)。根據在每項方法的 `Errors` 部分所列出的 API 特定錯誤，您可以判斷更多要捕捉 (catch) 的特定錯誤類型。

利用 [ 的 ](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.Exception.AwsException.html#_getAwsErrorCode)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;
    }
}
```