AWS SDK FOR PHP - итерация по getIterator и фильтрация ответов - PullRequest
0 голосов
/ 30 ноября 2018

У меня 0,5 миллиона изображений в корзине S3, и количество изображений растет на 35-40 тысяч в день.Изображения соответствуют номенклатуре следующим образом:

est20181127-124627.jpg
est20181127-124628.jpg

В именах указаны дата и время создания.Я использую AWS SDK FOR PHP для взаимодействия с S3 Bucket.Когда я предоставляю следующий код:

$objects = $s3->getIterator('ListObjects', ['Bucket' => $bucket]);
foreach ($objects as $object) {
    $urls = $s3->getObjectUrl(BUCKET, $object['Key']);
    echo $urls;
} 

, я получаю следующий ответ:

https://homesecmum.s3.ap-south-1.amazonaws.com/est20181127-124627.jpg https://homesecmum.s3.ap-south-1.amazonaws.com/est20181127-124628.jpg https://homesecmum.s3.ap-south-1.amazonaws.com/est20181127-124629.jpg https://homesecmum.s3.ap-south-1.amazonaws.com/est20181127-124630.jpg https://homesecmum.s3.ap-south-1.amazonaws.com/est20181127-124631.jpg https://homesecmum.s3.ap-south-1.amazonaws.com/est20181127-124632.jpg 

Я пытаюсь фильтровать изображения на основе шаблонов даты и времени.Я попробовал следующий код:

$stdate = '20181127-123556';
$endate = '20181127-123700';

$start = DateTime::createFromFormat('Ymj-His',$stdate);
$end   = DateTime::createFromFormat('Ymj-His',$endate);
$patternval = '/(?<year>\d{4})(?<month>\d{2})(?<day>\d{2})-(?<hour>\d{2})(?<minute>\d{2})(?<second>\d{2})/';
$format = 'Ymj-His';
foreach ($objects as $object) {
    $matches=array();     
    preg_match($patternval, basename($s3->getObjectUrl(BUCKET, $object['Key'])), $matches);
    if ($matches) {
        $filedate = DateTime::createFromFormat($format, $matches[0]);
    }
    if ($filedate >= $start && $filedate <= $end) {
              $good_files[] = $s3->getObjectUrl(BUCKET, $object['Key']);
              print_r($good_files);   
          }
    } 

Вышеприведенное возвращает следующее:

Array
(
    [0] => https://homesecmum.s3.ap-south-1.amazonaws.com/est20181127-124627.jpg
)
Array
(
    [0] => https://homesecmum.s3.ap-south-1.amazonaws.com/est20181127-124627.jpg
    [1] => https://homesecmum.s3.ap-south-1.amazonaws.com/est20181127-124628.jpg
)

, т. Е. Для каждого изображения в диапазоне времени и даты foreach выполняет итерации и предоставляет несколько массивов.Однако, когда я попытался с этим кодом:

for ($i = 0; $i < count($objects); $i++) {
    $matches=array();     
    preg_match($patternval, basename($s3->getObjectUrl(BUCKET, $object['Key'])), $matches);
    if ($matches) {
        $filedate = DateTime::createFromFormat($format, $matches[0]);
            }
    if ($filedate >= $start && $filedate <= $end) {
              $good_files[] = $s3->getObjectUrl(BUCKET, $object['Key']);
              print_r($good_files);  
          }
}

я получил следующую ошибку:

PHP Fatal error:  Cannot use object of type Generator as array in /var/www/html
...