AWS S3のPHPからの操作に関しての質問です。
S3バケットに画像が10万枚ほどありまして、この画像のURLを一括で取得したいと思い、他のWEBサイトを参照しつつ以下のようなコード書きました。
PHP
1require_once('aws.phar'); 2use Aws\S3\S3Client; 3use Aws\S3\Exception\S3Exception; 4 5date_default_timezone_set('Asia/Tokyo'); 6 7$key = '{key}'; 8$secret = '{secret}'; 9$region = 'us-east-1'; 10 11$S3 = S3Client::factory([ 12'credentials' => [ 13 'key' => $key, 14 'secret' => $secret 15], 16'region' => $region, 17'version' => '2006-03-01' 18]); 19 20ListAllObjects($S3, "{bucket_name}", $marker = null, $delimiter=null); 21 22function ListAllObjects($S3, $bucket, $marker = null, $delimiter=null){ 23 $objects = $S3->ListObjects(array( 24 'Bucket' => $bucket, 25 'Marker' => $marker, 26 'Delimiter' => $delimiter 27 )); 28 29 if(isset($objects["Contents"])){ 30 foreach ((array)$objects["Contents"] as $object) { 31 if(substr($object['Key'],-1,1) != "/"){ 32 unset($latest); 33 $latest = "s3://{$bucket}/{$object['Key']}"; 34 file_put_contents("export.csv", $latest . ",\n", FILE_APPEND); 35 } 36 } 37 if($objects["IsTruncated"] === TRUE){ 38 $key = ltrim($latest,"s3://{$bucket}/"); 39 ListAllObjects($S3, $bucket, $key, $delimiter); 40 } 41 } 42}
ここではわかりやすいように結果をcsvに落としています。
これを実行すると画像の取得量が多すぎるのかmemory exhaustedのエラーが出ます。
結果吐き出されたexport.csvを見るとどれについても同じURLが50回程度表示されていました。同じURLを取得することがなければmemory exaustedすることはないだろうと予想しているのですが、コードを見返してもなぜ同じ結果が複数回出力されるのかがわかりません。
これと違う方法でも構わないのですが、なんとかバケットに入っている画像すべてを取得したいです。何か解決方法がありましたらご教示いただきたいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/24 04:59
2017/05/25 03:02
2017/05/26 07:48