调用S3Client::setRegion()失败。

3
我正在使用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}

注意:

编辑

正如@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͢ck
@Ja͢ck 更糟糕的是:PHP致命错误:未捕获的异常'InvalidArgumentException',消息为'SetRegion操作未找到',因此似乎会通过__call()掉落并尝试将其发送到API端点,而不是在客户端中更改区域。 - Sammitch
我已经在该项目上提交了一个问题 - Ja͢ck
@Ja͢ck 很整洁。已订阅。 - Sammitch
1个回答

2

setRegion 不是您正在使用的 AWS SDK 版本中支持的方法。(您链接到的文档是 SDK 的 v2 版本。)

您可以创建一个新客户端,在构造函数中传递区域,例如 new Aws\S3\S3Client(['version' => $s3->getApi()->getApiVersion(), 'region' => $loc]).


1
糟糕的篮子。嗯,我基本上已经实现了这个解决方法,所以我想它只是晋升为规范解决方案。:I - Sammitch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接