Скрипту GD не удается обработать все изображения в массиве

#php #image-processing #gd

#php #обработка изображений #gd

Вопрос:

Я создавал галерею на php в качестве учебного упражнения, а также потому, что она мне понадобится для показа моих свадебных фотографий через пару месяцев.

Я написал функцию, которая обрабатывает изображения. Он проверяет, какие изображения находятся в исходной папке, и создает эскиз и предварительный просмотр для каждого. До сих пор он работал нормально, поскольку я тестировал небольшие партии изображений.

Теперь у меня есть 24 изображения в исходной папке, которые обрабатывают только первые 18. Я не получаю никаких отображаемых ошибок, кажется, он просто останавливается.

Функция

 function processImgs($previewWidth, $thumbWidth, $thumbPath, $previewPath, $originalPath) {

    $images = glob($originalPath."*");

    foreach($images as $image){

    $path_parts = pathinfo($image);

    // setup filenames
    $thumbFile = $thumbPath . "thumb_" . $path_parts['filename'] . ".jpg";
    $previewFile = $previewPath . "preview_" . $path_parts['filename'] . ".jpg";

    // calculate new images sizes
    $size = getimagesize($image);
    $originalWidth = $size['0'];
    $originalHeight = $size['1'];
    $previewHeight = $originalHeight / ($originalWidth / $previewWidth);
    $thumbHeight = $originalHeight / ($originalWidth / $thumbWidth);

    //create new images
    $original = imagecreatefromjpeg($image);
    $preview = imagecreatetruecolor($previewWidth, $previewHeight);
    $thumb = imagecreatetruecolor($thumbWidth, $thumbHeight);
    imagecopyresampled($preview, $original, 0, 0, 0, 0, $previewWidth, $previewHeight, $originalWidth, $originalHeight);
    imagecopyresampled($thumb, $original, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $originalWidth, $originalHeight);

    // save images to their new folders
        imagejpeg($preview, $previewFile);
        imagejpeg($thumb, $thumbFile);
        imagedestroy($original);
        imagedestroy($preview);
        imagedestroy($thumb);

    // give some feedback when the script runs
      if (file_exists($thumbFile) amp;amp; file_exists($previewFile)) {
        echo ". " . $path_parts['filename'] . " processed successfully.<br>";
      } else {
        echo ". " . $path_parts['filename'] . " <strong>failed.</strong><br>";
      }
    }
}
  

Я вызываю функцию следующим образом

 processImgs(1200, 400, "thumb/", "preview/", "original/");
  

Я не знаю, почему он не работает с большим количеством файлов. Есть ли ограничение по времени, которое я мог бы использовать? Это занимает некоторое время. В настоящее время я создаю это локально на MAMP.


Обновить

Майк был прав, время ожидания функции истекло. Его решение гораздо более подходящее.

Теперь я создал скрипт, который делает то, что он предложил, и он решил проблему. Спасибо за помощь. Я добавил приведенный ниже скрипт на случай, если он пригодится другим.

 $newWidth = 400;

if (isset($_GET['img']))     {

    $img = $_GET['img'];
    $filename = $img . ".jpg";

    if (file_exists($filename)) {

        $fp = fopen($filename, 'rb');
        header("Content-Type: image/jpeg");
        header("Content-Length: " . filesize($filename));
        fpassthru($fp);
        exit;

    } else {

        $originalFile = "../original/" . $filename;
        $original = imagecreatefromjpeg($originalFile);
        $size = getimagesize($originalFile);
        $newHeight = $size['1'] / ( $size['0'] / $newWidth);
        $new = imagecreatetruecolor($newWidth, $newHeight);
        imagecopyresampled($new, $original, 0, 0, 0, 0, $newWidth, $newHeight, $size['0'], $size['1']);
        imagejpeg($new, $filename);
        imagedestroy($original);
        imagedestroy($new);

        $fp = fopen($filename, 'rb');
        header("Content-Type: image/jpeg");
        header("Content-Length: " . filesize($filename));
        fpassthru($fp);
    }

}
  

Комментарии:

1. PHP имеет ограничение по времени выполнения по умолчанию, после которого он просто … остановится. Вы можете изменить значение, отредактировав PHP. INI, если у вас есть к этому доступ. Лучший подход — проверить, был ли сгенерирован эскиз при запросе, и затем сгенерировать его. Последующие запросы получат уже созданную версию.

2. Я не получаю никаких отображаемых ошибок , вы включили сообщение об ошибках? error_reporting(E_ALL); ini_set('display_errors', 'on');