我正在使用composer安装
"aws/aws-sdk-php": "3.0.3"
来访问不同区域的S3存储桶,但是我似乎无法通过setRegion()
函数更改S3Client的区域,因为它会生成以下错误信息:代码如下:PHP Catchable fatal error: Argument 2 passed to Aws\AwsClient::getCommand() must be of the type array, string given, called in vendor/aws/aws-sdk-php/src/AwsClient.php on line 166 and defined in vendor/aws/aws-sdk-php/src/AwsClient.php on line 210
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文档中提到该方法继承自
Aws\Common\Client\AbstractClient
Aws\Common\Client\AbstractClient
文档中提到该函数接受一个字符串参数- 但看起来它似乎因为某种原因落到了
Aws\AwsClient::__call()
里面?
编辑
正如@giaour所说,S3Client::setRegion()
在v3客户端中已经不存在了,而我链接的文档是针对v2的。[我不知道为什么它被标记为“最新”]
以下是我实现的解决方法,现在已经升级为“规范”:
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͢ckPHP致命错误:未捕获的异常'InvalidArgumentException',消息为'SetRegion操作未找到'
,因此似乎会通过__call()
掉落并尝试将其发送到API端点,而不是在客户端中更改区域。 - Sammitch