AWS PHP SDK getIterator()和MaxKeys

时间:2014-02-03 14:33:57

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

我试图只获取S3 Bucket文件夹中的第一个文件。

使用官方PHP SDK,我的代码如下:

$client = S3Client::factory(array('key'=>'...','secret'=>'...'));
$result = $client->getIterator('ListObjects',array(
    'Bucket' => 'my_bucket_name',
    'Prefix' => 'myfolder/',
    'MaxKeys' => 1, 
));
foreach($result as $object)
{
  ...
}

现在,看起来MaxKeys参数没有做任何事情,因为这个结果包含'myfolder'中的所有文件

再次阅读文档,似乎getIterator基本上一直向AWS运行查询,直到从那里获取所有文件, 有什么方法可以将它限制为只有一个吗?

我也试过在没有getIterator的情况下运行查询,如下所示:

$result = $client->ListObjects(array(
    'Bucket' => 'my_bucket_name',
    'Prefix' => 'myfolder/',
    'MaxKeys' => 1, 
));

在这种情况下,我只获取文件夹名称而不是文件,并且格式完全不同,我猜它是第一个:

Iterator Object
(
    [storage:ArrayIterator:private] => Array
        (
            [Name] => my_bucket_name
            [Prefix] => myfolder/
            [Marker] => Array
                (
                )

            [MaxKeys] => 1
            [IsTruncated] => 1
            [Contents] => Array
                (
                    [0] => Array
                        (
                            [Key] => myfolder/
                            [LastModified] => 2014-02-03T13:17:55.000Z
                            [ETag] => "d41d8cd98f00b204e9800998ecf8427e"
                            [Size] => 0
                            [Owner] => Array
                                (
                                    [ID] => ...
                                    [DisplayName] => amazon
                                )

                            [StorageClass] => STANDARD
                        )
                )

            [EncodingType] => 
            [RequestId] => E5TYHGG24FE73D8
        )

)

我该如何正确地做到这一点?

由于

2 个答案:

答案 0 :(得分:3)

'MaxKeys'参数应用于操作,而不是迭代器,因此您实际上正在执行一堆ListObjects操作,每个操作返回一个对象,直到返回所有对象。 / p>

相反,您需要按照iterators sectionAWS SDK for PHP User Guide中的说明对迭代器设置限制。

$iterator = $client->getListObjectsIterator(array(
    'Bucket' => 'my-bucket'
), array(
    'limit'  => 1,
));

foreach ($iterator as $object) {
    echo $object['Key'] . "\n";
}
// This should only print 1 object's key.

同时执行->listObjects()getIterator('ListObjects')会做不同的事情。

  • ->listObjects()执行单个S3 ListObjects操作,并将完整结果作为Guzzle\Service\Resource\Model返回,这只是一个行为类似于数组的对象。见Modeled Responses
  • ->getIterator('ListObjects')返回Aws\Common\Iterator\AwsResourceIterator对象,该对象实现PHP's Iterator interface,并且在您实际迭代它之前不执行任何操作(例如,使用foreach)。迭代它时,它会在响应中逐个发出有关每个对象的数据。它将根据需要向S3发出其他请求,直到返回了与请求参数匹配的所有对象,或者达到指定的limit

答案 1 :(得分:0)

foreach ($result->getIterator() as $object) {
  .... do stuff with $object;
  break(); // terminate the loop
}