我如何获得"偏移"在AWS S3对象版本列表中?

时间:2015-04-10 15:35:06

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

这是我的方法:

public function listVersionsForPath($s3Path, $bucketName, $offset, $limit) {
    $versions = array();

    $tmpS3Path = $this->cleanS3Path($s3Path);
    $fullBucketName = self::getFullBucketName($bucketName);

    $request = array(
        'Bucket' => $fullBucketName,
        'Prefix' => $tmpS3Path,
        'MaxKeys' => 100,
        'VersionIdMarker' => ???,
    );

    $iterator = $this->client->getListObjectVersionsIterator($request);

    foreach ($iterator as $object) {
        if(!isset($versions[$object['Key']])) {
            $versions[$object['Key']] = array();
        }
        $versions[$object['Key']][] = $object['VersionId'];
    }

    return $versions;
}

我需要将返回的版本数量限制为至少100,因为我有一个1000多个版本的对象使PHP直接崩溃。但是,我不知道如何跳过前100个版本,让它们内存不足,然后加载下一个版本。

最后,我至少找到了S3请求中所有有效选项的列表。如果您在aws.phar中打开S3Client.php,那么在第184行上有一个AWS的列表,相当于'offset'。基本上,您必须获取对象列表,然后将偏移量设置为上一个列表中最后一个键的值。我自己还没能做到这一点,我正在使用继续;休息假的分页。

2 个答案:

答案 0 :(得分:1)

在AWS S3对象版本列表中获取偏移量的唯一方法是遍历前X个条目,丢弃它们,然后仅返回所请求的条目。这是我上次使用此代码的时间(3年前)对API的限制。

答案 1 :(得分:0)

我认为您可以使用StartAfter来补偿,但是您需要一个键来开始补偿。为此,获取约100个项目,并记录最后一个的ID。然后,您可以使用StartAfter从该ID开始。这不是完美的,但它是最好的。

// 1) get items
  const { Contents, IsTruncated } = await s3.listObjectsV2({
    Bucket
    MaxKeys: 100,
  }).promise()
// 2) remember last key
  const last = Contents[Contents.length-1].Key
// 3) query via StartFrom
  const { Contents } = await s3.listObjectsV2({
    Bucket,
    MaxKeys: 100,
    StartAfter: last,
  }).promise()