调用S3Client :: setRegion()失败

时间:2015-06-11 23:50:48

标签: php amazon-web-services amazon-s3 aws-php-sdk

我正在通过composer使用"aws/aws-sdk-php": "3.0.3"访问不同区域的某些S3存储桶,但我似乎无法使用setRegion()函数让S3Client更改区域而不会产生错误:< / p>

  

PHP Catchable致命错误:传递给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}

注意:

修改

正如@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);
    ...
}

1 个答案:

答案 0 :(得分:2)

setRegion不是您正在使用的AWS开发工具包版本中受支持的方法。 (您链接的文档适用于SDK的v2。)

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