适用于 PHP 的 Amazon SDK 版本 3 的常见问题 - 适用于 PHP 的 Amazon SDK
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

适用于 PHP 的 Amazon SDK 版本 3 的常见问题

在客户端上可以使用哪些方法?

适用于 PHP 的 Amazon SDK使用服务描述和动态 magic __call() 方法执行 API 操作。您可以在 Web 服务客户端的 API 文档中找到该客户端提供的所有方法的完整列表。

遇到 cURL SSL 证书错误该怎么办?

如果包含 cURL 和 SSL 的 CA 捆绑包已过期,使用它会发生此问题。更新服务器上的 CA 捆绑包,或直接从 cURL 网站下载最新的 CA 捆绑包,可解决此问题。

默认情况下,适用于 PHP 的 Amazon SDK 将使用编译 PHP 时配置的 CA 捆绑包。您可以修改 openssl.cafile PHP .ini 配置设置(设为磁盘上 CA 文件的路径),更改 PHP 使用的默认 CA 捆绑包。

客户端提供哪些 API 版本?

创建客户端时必须提供 version 选项。在每个客户端的 API 文档页面 ::aws-php-class:<index.html> 上均提供了可用 API 版本的列表。如果您无法加载特定 API 版本,可能需要更新 适用于 PHP 的 Amazon SDK 的副本。

您可以为“version”配置值提供字符串 latest,以使用客户端的 API 提供程序可以找到的最新可用 API 版本(默认 api_provider 会扫描开发工具包的 src/data 目录来查找 API 模型)。

警告

我们不建议在生产应用程序中使用 latest,因为拉取包含 API 更新的开发工具包新次要版本会使您的生产应用程序崩溃。

客户端提供哪些区域的版本?

创建客户端时需提供 region 选项,使用字符串值指定。有关可用 Amazon 区域和端点的列表,请参阅 Amazon Web Services 一般参考 中的 Amazon 区域和端点

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

有关更多信息,请参阅 mapRequest

如何针对任意请求签名?

您可使用 SDK 的 :aws-php-class: SignatureV4 class <class-Aws.Signature.SignatureV4.html> 来针对一个任意 :aws-php-class: PSR-7 request <class-Psr.Http.Message.RequestInterface.html> 签名。

请参阅使用 适用于 PHP 的 Amazon SDK 版本 3 来针对自定义 Amazon CloudSearch 域请求签名,了解操作方法的完整示例。

如何在发送命令之前修改命令?

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

有关更多信息,请参阅 mapCommand

什么是 CredentialsException?

如果您在使用Aws\Exception\CredentialsException时看到 适用于 PHP 的 Amazon SDK,这就意味着没有为开发工具包提供任何凭证,也无法在环境中找到凭证。

如果您将一个没有凭证的客户端实例化,则在首次执行服务操作时,开发工具包会尝试寻找凭证。它首先会检查一些特定的环境变量,然后寻找实例配置文件凭证(仅在经过配置的 Amazon EC2 实例上提供)。如果绝对没有提供或无法找到凭证,将会引发 Aws\Exception\CredentialsException

如果看到这种错误,且希望使用实例配置文件凭证,则需要确保运行 SDK 的 Amazon EC2 实例配置了适当的 IAM 角色。

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

有关更多信息,请参阅 适用于 PHP 的 Amazon SDK 版本 3 的凭证

适用于 PHP 的 Amazon SDK 是否适用于 HHVM?

适用于 PHP 的 Amazon SDK目前无法在 HHVM 上运行,并且在 HHVM 中的生成语义问题得到解决之前,将无法支持 HHVM。

如何禁用 SSL?

将客户端工厂方法的 scheme 参数设为“http”,可禁用 SSL。请务必注意,并不是所有服务都支持 http 访问。请参阅 Amazon Web Services 一般参考 中的 Amazon 区域和端点,了解区域、端点和支持方案的列表。

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

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

出现“解析错误”该怎么办?

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

如果您遇到解析错误,请检查系统,确保其满足 SDK 的 适用于 PHP 的 Amazon SDK 版本 3 的要求和建议

为什么 Amazon S3 客户端会解压缩使用 gzipp 进行压缩的文件?

一些 HTTP 处理程序,包括默认的 Guzzle 6 HTTP 处理程序,在默认情况下会扩大经过压缩的响应正文。您可以将 decode_content HTTP 选项设置为 false,覆盖这一行为。为了向后兼容,此默认值无法改变,但我们建议您在 S3 客户端级别禁用内容解码。

请参阅 decode_content,了解如何禁用内容自动解码的示例。

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

您可以将命令对象中的 ContentSHA256 参数设置为 Aws\Signature\S3SignatureV4::UNSIGNED_PAYLOAD,禁用正文签名。然后适用于 PHP 的 Amazon 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 的 Amazon SDK 中处理的方案?

适用于 PHP 的 Amazon SDK的 RetryMiddleware 可处理重试行为。对于 5xx HTTP 服务器错误状态代码,开发工具包会重试 500、502、503 和 504。

限制异常也会进行重试,包括 RequestLimitExceededThrottlingProvisionedThroughputExceededExceptionThrottlingExceptionRequestThrottledBandwidthLimitExceeded

适用于 PHP 的 Amazon SDK 还在重试方案中将指数延迟与退避和抖动算法集成。而且,所有服务的默认重试行为均配置为 3,只有 Amazon DynamoDB 配置为 10

如何处理具有错误代码的异常?

除了 适用于 PHP 的 Amazon SDK 自定义的 Exception 类以外,每个 Amazon 服务客户端都有其各自的异常类,该类继承自 AwsExceptionAwsException。您可以根据每种方法 Errors 部分列出的特定于 API 的错误,确定要捕获的更多具体错误类型。

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