Вызов S3Client::setRegion() не работает

Я использую "aws/aws-sdk-php": "3.0.3" через композитор для доступа к некоторым корзинам S3 в разных регионах, но я не могу заставить S3Client менять регионы с помощью функции setRegion() без возникновения ошибки:

Перехватываемая фатальная ошибка PHP: аргумент 2, передаваемый в Aws\AwsClient::getCommand(), должен иметь тип массива, заданной строки, вызываться в vendor/aws/aws-sdk-php/src/AwsClient.php в строке 166 и определяться в поставщик/aws/aws-sdk-php/src/AwsClient.php в строке 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);
    ...
}

person Sammitch    schedule 11.06.2015    source источник
comment
Вы пробовали $s3->setRegion(['us-east-1']);?   -  person Ja͢ck    schedule 12.06.2015
comment
@Jack еще хуже: PHP Fatal error: Uncaught exception 'InvalidArgumentException' with message 'Operation not found: SetRegion' похоже, что он проваливается до __call() и пытается передать это в конечную точку API, а не менять регион в клиенте.   -  person Sammitch    schedule 12.06.2015
comment
Я отправил проблему по проекту.   -  person Ja͢ck    schedule 12.06.2015
comment
@ Джек аккуратный. Подписано.   -  person Sammitch    schedule 12.06.2015


Ответы (1)


setRegion не поддерживается используемой вами версией AWS SDK. (Документы, на которые вы ссылаетесь, относятся к v2 SDK.)

Вы можете создать нового клиента и передать регион в конструкторе, например, new Aws\S3\S3Client(['version' => $s3->getApi()->getApiVersion(), 'region' => $loc]).

person giaour    schedule 12.06.2015
comment
Мусорные корзины. Ну, я в основном уже реализовал это как обходной путь, так что я думаю, что он просто стал каноническим. :I - person Sammitch; 12.06.2015