Php 调用S3Client::setRegion()失败
我正在通过composer使用Php 调用S3Client::setRegion()失败,php,amazon-web-services,amazon-s3,aws-php-sdk,Php,Amazon Web Services,Amazon S3,Aws Php Sdk,我正在通过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/AwsClie
“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中定义
代码:
输出:
foo
string(9) "us-east-1"
PHP Catchable fatal error: {snip}
注:
- 假设该方法是从Aws\Common\Client\AbstractClient继承的
- 假设函数接受一个字符串
- 但这似乎是由于某种原因而落到
头上的Aws\AwsClient::\uu call()
S3Client::setRegion()
不再存在于v3客户端中,我链接的文档是针对v2的。[我不知道为什么它被标记为“最新”]
以下是我作为解决方案实现的代码,它刚刚升级为“canonical”:
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);
...
}
setRegion
在您使用的AWS SDK版本中不受支持。(您链接到的文档用于SDK的v2。)
您可以创建一个新的客户端并在构造函数中传入区域,例如,
new Aws\S3\S3Client(['version'=>$S3->getApi()->getApiVersion(),'region'=>$loc])
您是否尝试过$S3->setRegion(['us-east-1'])
?@Ja͢ck甚至更糟:PHP致命错误:未捕获异常“InvalidArgumentException”和消息“Operation not found:SetRegion”
,因此它似乎陷入了u call()
的困境,并试图将其发送到API端点,而不是更改客户端中的区域。我已经在该项目上提交了一份声明。@Ja͢ck neat。我喜欢垃圾筐。嗯,我基本上已经把它作为一种解决方法来实现了,所以我猜它刚刚升级到canonical<代码>:I
foreach($buckets as $bucket) {
$region = $this->s3()->getBucketLocation(['Bucket' => $bucket])['LocationConstraint'];
$s3 = $this->s3($region);
...
}