LoginSignup
18
20

More than 5 years have passed since last update.

【AWS SDK for PHP】ListObjects関数で、S3から1000件超えのリストを取得する方法。

Posted at

概要

「AWS SDK for PHP」のListObjects関数は、
普通に使うと1000件までしかリストしてくれない仕様になっているが、
1000件超えでも取得できる方法は用意されているため、関数化してみました。

ポイント

  1. ListObjects実行時に、1000件超えしていた場合、$objects["IsTruncated"]にTRUEがセットされて返ってくる。
  2. ListObjects実行時、Marker引数にファイルのS3キーを指定すると、指定したファイルの次のファイルから1000件リストしてくれる。
  3. $objects["IsTruncated"]===TRUE の場合、取得したリストの一番末尾のファイルをMarker引数に指定して再度ListObjects関数を実行する。
  4. 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;
}
18
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
20