这是我的方法:
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 个版本,将它们从内存中取出,然后加载下一个 100 个版本。
最后,我至少找到了 S3 请求中所有有效选项的列表。如果您在 aws.phar 中打开 S3Client.php则在第 184 行有一个列表,列出了 AWS 相当于"偏移量"的内容。基本上,您必须获取对象列表,然后将偏移量设置为上一个列表中的最后一个键的值。我自己还不能做到这一点,我正在使用继续;和休息;用于假分页。
在 AWS S3 对象版本列表中获取偏移量的唯一方法是迭代前 X 个条目,丢弃它们,然后仅返回请求的条目。这是我上次处理此代码(3 年前)的 API 的限制。
您可以使用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()