

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 适用于 PHP 的 AWS SDK 版本 3 的常见问题
<a name="faq"></a>

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

适用于 PHP 的 AWS SDK使用服务描述和动态 [magic \$1\$1call() 方法](http://www.php.net/manual/en/language.oop5.overloading.php#object.call)执行 API 操作。您可以在 Web 服务客户端的 [API 文档](https://docs.aws.amazon.com/aws-sdk-php/v3/api/index.html)中找到该客户端提供的所有方法的完整列表。

## 遇到 cURL SSL 证书错误该怎么办？
<a name="what-do-i-do-about-a-curl-ssl-certificate-error"></a>

如果包含 cURL 和 SSL 的 CA 捆绑包已过期，使用它会发生此问题。更新服务器上的 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 一般参考 中的 [AWS 区域和端点](https://docs.aws.amazon.com/general/latest/gr/rande.html)。

```
// 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 位整数，适用于 PHP 的 AWS SDK 无法在 32 位体系（此处所指的“体系”包含 CPU、操作系统、Web 服务器和 PHP 二进制文件）中正确处理超过 2 GB 的文件。这是一个[常见的 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` 帮助程序方法来为特定 Amazon S3`PutObject` 操作添加 `X-Foo-Baz` 标题。

有关更多信息，请参阅 [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 request <class-Psr.Http.Message.RequestInterface.html>* 签名。

请参阅[使用 适用于 PHP 的 AWS SDK 版本 3 来针对自定义 Amazon CloudSearch 域请求签名](service_cloudsearch-custom-requests.md)，了解操作方法的完整示例。

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

您可以将自定义中间件添加到 `Aws\HandlerList` 或 `Aws\CommandInterface` 的 `Aws\ClientInterface`，在发送命令之前修改命令。以下示例展示了如何在发送命令之前为其添加自定义命令参数，即添加默认选项。此示例使用 `Aws\Middleware::mapCommand` 帮助程序方法。

有关更多信息，请参阅 [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 角色。

如果您看到这种错误，且**不**希望使用实例配置文件凭证，则需要为开发工具包提供适当的凭证。

有关更多信息，请参阅 [适用于 PHP 的 AWS SDK 版本 3 的凭证](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)得到解决之前，将无法支持 HHVM。

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

将客户端工厂方法的 `scheme` 参数设为“http”，可禁用 SSL。请务必注意，并不是所有服务都支持 `http` 访问。请参阅 AWS 一般参考 中的 [AWS 区域和端点](https://docs.aws.amazon.com/general/latest/gr/rande.html)，了解区域、端点和支持方案的列表。

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

**警告**  
与 TCP 相比，SSL 要求所有数据均需加密，完成连接握手需要的 TCP 数据包数也更多，因此禁用 SSL 可能会小幅提升性能。但禁用 SSL 后，通过线路发送的所有数据均不会加密。在禁用 SSL 之前，您必须仔细考虑安全隐患，以及通过网络窃取的潜在可能。

## 出现“解析错误”该怎么办？
<a name="what-do-i-do-about-a-parse-error"></a>

PHP 引擎如果遇到不理解的语法，就会引发解析错误。如果尝试运行使用其他版本的 PHP 编写的代码，总会遇到这种错误。

如果您遇到解析错误，请检查系统，确保其满足 SDK 的 [适用于 PHP 的 AWS SDK 版本 3 的要求和建议](getting-started_requirements.md)。

## 为什么 Amazon S3 客户端会解压缩使用 gzipp 进行压缩的文件？
<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 还在重试方案中将指数延迟与退避和抖动算法集成。而且，所有服务的默认重试行为均配置为 `3`，只有 Amazon DynamoDB 配置为 `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 的错误，确定要捕获的更多具体错误类型。

[ 的 ](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;
    }
}
```