Я использую "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}
Заметки:
- S3Client Docs говорит метод унаследован от
Aws\Common\Client\AbstractClient
Aws\Common\Client\AbstractClient
Документы a> скажем, функция принимает строку- Но похоже, что по какой-то причине это проваливается до
Aws\AwsClient::__call()
?
редактировать
Как сказал @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']);
? - person Ja͢ck   schedule 12.06.2015PHP Fatal error: Uncaught exception 'InvalidArgumentException' with message 'Operation not found: SetRegion'
похоже, что он проваливается до__call()
и пытается передать это в конечную точку API, а не менять регион в клиенте. - person Sammitch   schedule 12.06.2015