概要
「AWS SDK for PHP」のListObjects関数は、
普通に使うと1000件までしかリストしてくれない仕様になっているが、
1000件超えでも取得できる方法は用意されているため、関数化してみました。
ポイント
- ListObjects実行時に、1000件超えしていた場合、$objects["IsTruncated"]にTRUEがセットされて返ってくる。
- ListObjects実行時、Marker引数にファイルのS3キーを指定すると、指定したファイルの次のファイルから1000件リストしてくれる。
- $objects["IsTruncated"]===TRUE の場合、取得したリストの一番末尾のファイルをMarker引数に指定して再度ListObjects関数を実行する。
- 3を $objects["IsTruncated"]===FALSE になるまで繰り返す。
ソース
<?php
require '/opt/aws-sdk/vendor/autoload.php';
use Aws\S3\S3Client;
$S3 = S3Client::factory();
$S3->registerStreamWrapper();
// リストを取得して、表示
var_dump(ListAllObjects($S3, "bucket_name", "key/key2", $marker = null, $delimiter=null));
// 1000件超えでも、全てリストしてくれる関数。
function ListAllObjects($S3, $bucket, $bucketPrefix, $marker = null, $delimiter=null){
$objects = $S3->ListObjects(array(
'Bucket' => $bucket,
'Prefix' => $bucketPrefix,
'Marker' => $marker,
'Delimiter' => $delimiter
));
$list = array();
if(isset($objects["Contents"])){
// 取得したファイルのリストを$list配列に追加していく。
foreach ((array)$objects["Contents"] as $object) {
// フォルダはスルー。ファイルのみ追加。
if(substr($object['Key'],-1,1) != "/"){
array_push($list, "s3://{$bucket}/{$object['Key']}");
}
}
// リストの結果が1000件超えの場合、IsTruncated がTRUEで返ってくる。=> FALSEになるまで繰り返せば良い。
if($objects["IsTruncated"] === TRUE){
$key = ltrim($list[count($list)-1],"s3://{$bucket}/"); // S3キー部分を取り出すして、これをMarkerに指定する。
$list = array_merge($list,ListAllObjects($S3, $bucket, $bucketPrefix, $key, $delimiter)); // 再帰処理
}
}
return $list;
}