3

composer を使用してさまざまなリージョンのいくつかの S3 バケットにアクセスしていますが、エラーを生成せずに関数を"aws/aws-sdk-php": "3.0.3"使用して S3Client にリージョンを変更させることができないようです:setRegion()

PHP Catchable fatal error: Argument 2 passed to Aws\AwsClient::getCommand() must be a type array, string given, 166 行目の vendor/aws/aws-sdk-php/src/AwsClient.php で呼び出され、で定義されていますvendor/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ドキュメントは、関数が文字列を受け入れると言います
  • しかし、これは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);
    ...
}
4

1 に答える 1

2

setRegionは、使用している AWS SDK のバージョンでサポートされている方法ではありません。(リンク先のドキュメントは SDK の v2 用です。)

新しいクライアントを作成し、コンストラクターでリージョンを渡すことができますnew Aws\S3\S3Client(['version' => $s3->getApi()->getApiVersion(), 'region' => $loc])

于 2015-06-12T20:40:41.353 に答える