Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 调用S3Client::setRegion()失败_Php_Amazon Web Services_Amazon S3_Aws Php Sdk - Fatal编程技术网

Php 调用S3Client::setRegion()失败

Php 调用S3Client::setRegion()失败,php,amazon-web-services,amazon-s3,aws-php-sdk,Php,Amazon Web Services,Amazon S3,Aws Php Sdk,我正在通过composer使用“aws/aws sdk php:“3.0.3”访问不同区域中的一些S3存储桶,但我似乎无法让S3Client使用setRegion()函数更改区域,而不生成错误: PHP可捕获致命错误:传递给Aws\AwsClient::getCommand()的参数2必须是数组类型,字符串给定,在第166行的vendor/Aws/Aws sdk PHP/src/AwsClient.PHP中调用,并在第210行的vendor/Aws/Aws sdk PHP/src/AwsClie

我正在通过composer使用
“aws/aws sdk php:“3.0.3”
访问不同区域中的一些S3存储桶,但我似乎无法让S3Client使用
setRegion()
函数更改区域,而不生成错误:

PHP可捕获致命错误:传递给Aws\AwsClient::getCommand()的参数2必须是数组类型,字符串给定,在第166行的vendor/Aws/Aws sdk PHP/src/AwsClient.PHP中调用,并在第210行的vendor/Aws/Aws sdk PHP/src/AwsClient.PHP中定义

代码:

输出:

foo
string(9) "us-east-1"
PHP Catchable fatal error:  {snip}
注:

  • 假设该方法是从Aws\Common\Client\AbstractClient继承的
  • 假设函数接受一个字符串
  • 但这似乎是由于某种原因而落到
    Aws\AwsClient::\uu call()
    头上的
编辑 正如@giaour所说,
S3Client::setRegion()
不再存在于v3客户端中,我链接的文档是针对v2的。[我不知道为什么它被标记为“最新”]

以下是我作为解决方案实现的代码,它刚刚升级为“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版本中不受支持。(您链接到的文档用于SDK的v2。)


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

您是否尝试过
$S3->setRegion(['us-east-1'])
?@Ja͢ck甚至更糟:
PHP致命错误:未捕获异常“InvalidArgumentException”和消息“Operation not found:SetRegion”
,因此它似乎陷入了
u call()
的困境,并试图将其发送到API端点,而不是更改客户端中的区域。我已经在该项目上提交了一份声明。@Ja͢ck neat。我喜欢垃圾筐。嗯,我基本上已经把它作为一种解决方法来实现了,所以我猜它刚刚升级到canonical<代码>:I
foreach($buckets as $bucket) {
    $region = $this->s3()->getBucketLocation(['Bucket' => $bucket])['LocationConstraint'];
    $s3 = $this->s3($region);
    ...
}