【发布时间】:2015-08-27 21:16:32
【问题描述】:
我通过 composer 使用 "aws/aws-sdk-php": "3.0.3" 访问不同区域的一些 S3 存储桶,但我似乎无法让 S3Client 使用 setRegion() 函数更改区域而不产生错误:
PHP 可捕获的致命错误:传递给 Aws\AwsClient::getCommand() 的参数 2 必须是数组类型,给定字符串,在第 166 行的 vendor/aws/aws-sdk-php/src/AwsClient.php 中调用并在第 210 行的 vendor/aws/aws-sdk-php/src/AwsClient.php 中定义
代码:
foreach($buckets as $bucket) {
echo 'foo' . PHP_EOL;
$loc = $s3->getBucketLocation(['Bucket' => $bucket])['LocationConstraint'];
var_dump($loc);
$s3->setRegion($loc);
echo 'bar' . PHP_EOL;
$years = $s3->listObjects([
'Bucket' => $bucket,
'Delimiter' => '/'
]);
var_dump($bucket, $years);
}
输出:
foo
string(9) "us-east-1"
PHP Catchable fatal error: {snip}
注意事项:
-
S3Client Docs 说方法继承自
Aws\Common\Client\AbstractClient -
Aws\Common\Client\AbstractClientDocs 说函数接受一个字符串 - 但它看起来好像因为某种原因而落入
Aws\AwsClient::__call()?
编辑
正如@giaour 所说,S3Client::setRegion() 不再存在于 v3 客户端中,我链接的文档是针对 v2.2 的。 [我不知道为什么它被标记为“最新”]
这是我作为解决方法实施的代码,刚刚升级为“规范”:
protected function s3($region='us-west-2') {
if( ! isset($this->_clients[$region]) ) {
$this->_clients[$region] = new Aws\S3\S3Client([
'version' => $this->_aws_version,
'region' => $region,
'credentials' => $this->credentials
]);
}
return $this->_clients[$region];
}
然后:
foreach($buckets as $bucket) {
$region = $this->s3()->getBucketLocation(['Bucket' => $bucket])['LocationConstraint'];
$s3 = $this->s3($region);
...
}
【问题讨论】:
-
你试过
$s3->setRegion(['us-east-1']);吗? -
@Ja͢ck 更糟糕的是:
PHP Fatal error: Uncaught exception 'InvalidArgumentException' with message 'Operation not found: SetRegion'所以它似乎正在落入__call()并试图将其发送到 API 端点而不是更改客户端中的区域。 -
我已在该项目上提交了issue。
-
@Ja͢ck 整洁。已订阅。
标签: php amazon-web-services amazon-s3 aws-php-sdk