调用 S3Client::setRegion() 失败
Call to S3Client::setRegion() fails
我正在通过 composer 使用 "aws/aws-sdk-php": "3.0.3"
来访问不同区域中的一些 S3 存储桶,但我似乎无法让 S3Client 使用 setRegion()
函数更改区域而不生成错误:
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 Docs 说方法继承自
Aws\Common\Client\AbstractClient
Aws\Common\Client\AbstractClient
Docs 说这个函数接受一个字符串
- 但由于某种原因,这看起来有点像
Aws\AwsClient::__call()
?
编辑
正如@giaour 所说,S3Client::setRegion()
不再存在于 v3 客户端中,我链接的文档是针对 v2 的。 [我不知道为什么它被标记为 'latest']
这是我作为变通方法实现的代码,它现在升级到 '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 的 v2。)
您可以创建一个新的客户端,并在构造函数中传入区域,例如new Aws\S3\S3Client(['version' => $s3->getApi()->getApiVersion(), 'region' => $loc])
。
我正在通过 composer 使用 "aws/aws-sdk-php": "3.0.3"
来访问不同区域中的一些 S3 存储桶,但我似乎无法让 S3Client 使用 setRegion()
函数更改区域而不生成错误:
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 Docs 说方法继承自
Aws\Common\Client\AbstractClient
Aws\Common\Client\AbstractClient
Docs 说这个函数接受一个字符串- 但由于某种原因,这看起来有点像
Aws\AwsClient::__call()
?
编辑
正如@giaour 所说,S3Client::setRegion()
不再存在于 v3 客户端中,我链接的文档是针对 v2 的。 [我不知道为什么它被标记为 'latest']
这是我作为变通方法实现的代码,它现在升级到 '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 的 v2。)
您可以创建一个新的客户端,并在构造函数中传入区域,例如new Aws\S3\S3Client(['version' => $s3->getApi()->getApiVersion(), 'region' => $loc])
。