2013-05-29 6 views
1

Я создаю скрипт для сканирования каталога изображений, а затем создаю миниатюру в другой каталог.Scan Directory and Create Thumbnail Images

function createThumbs($pathToImages, $pathToThumbs, $thumbWidth) 
{ 
// Turn off all error reporting 
error_reporting(0); 

set_time_limit(0); 
    // open the directory 
    $dir = opendir($pathToImages); 

    // loop through it, looking for any/all JPG files: 
    $i='1'; 
    while (false !== ($fname = readdir($dir))) { 
    // parse path for the extension 
    $info = pathinfo($pathToImages . $fname); 
    // continue only if this is a JPEG image 
     $source_file_name = basename($source_image); 
     $source_image_type = substr($source_file_name, -3, 3); 

     switch(strtolower($info['extension'])) 
     { 
     case 'jpg': 
      $img = imagecreatefromjpeg("{$pathToImages}{$fname}"); 
      break; 

     case 'gif': 
      $img = imagecreatefromgif("{$pathToImages}{$fname}"); 
      break; 

     case 'png': 
      $img = imagecreatefrompng("{$pathToImages}{$fname}"); 
      break;  
     } 

     echo "$i : Creating thumbnail for small_$fname <br />"; 

     // load image and get image size 
     $width = imagesx($img); 
     $height = imagesy($img); 

    // this will be our cropped image 

    // copy the crop area from the source image to the blank image created above 

    // calculate thumbnail size 
     $new_width = $thumbWidth; 
     $new_height = $thumbWidth; 

     // create a new tempopary image 
     $tmp_img = imagecreatetruecolor($new_width, $new_height); 


     // copy and resize old image into new image 
     imagecopyresized($tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height); 


    switch(strtolower($info['extension'])) 
    { 
     case 'jpg': 
      imagejpeg($tmp_img, "{$pathToThumbs}small_$fname", 100); 
      break; 

     case 'gif': 
      imagegif($tmp_img, "{$pathToThumbs}small_$fname"); 
      break; 

     case 'png': 
      imagepng($tmp_img,"{$pathToThumbs}small_$fname", 0); 
      break;  
    } 
    imagedestroy($img); 
    imagedestroy($tmp_img); 
    $i++; 
     } 
    // close the directory 
    closedir($dir); 
} 

И Мы называем эти функции с

createThumbs("media/normal/","media/small/",70); 

Скрипт работает хорошо, но проблема, я имею около 4000 изображений, и сценарий перестал создавать миниатюру около 2400-2600 изображений

вы можете использовать эту ссылку http://saharandev.co.uk/saharan/create_thumbs_small.php

Кто-нибудь может помочь?

Спасибо

+0

Что вы подразумеваете под «прекрасным созданием»? Сценарий прекратил выполнение? Не перебирать эти изображения? Выполнять отлично, но просто ничего не делать с этими изображениями? Выбросить исключение? Выбросить ошибку? Предупреждение? На какой линии? – Patashu

+0

Просмотрите журнал: остановился ли сценарий с тайм-аутом, OOM или что-то еще? –

+2

@Patashu: Я запустил скрипт, и он остановился на '2335: Создание миниатюры для small_S60.10700.jpg', я рекомендую удалить« error_reporting (0); ', чтобы показать ошибки. –

ответ

0

Я столкнулся с подобной проблемой некоторое время назад. Я предполагаю, что ваша директива времени выполнения PHP-скриптов на вашем сервере хостинга php.ini установлена ​​на более низкое значение времени, чем то, что необходимо для выполнения ваших задач обработки.

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

function createThumbs($pathToImages, $pathToThumbs, $thumbWidth) 
{ 
    ini_set('max_execution_time', 300); //300 seconds = 5 minutes 
    ... Your code here ... 
} 

Если вы по-прежнему работать на ошибки, попробуйте увеличить max_execution_time на более высокое значение.

ИЛИ

Проверьте, если у вас есть другие, чем .jpeg, .gif и .png в каталоге исходных файлов и удалить их. Это может быть файл .bmp или Thumbs.db, вызывающий ошибки. Я упомянул Thumbs.db, потому что Windows обычно создает этот файл в папках с видео или фотографиями.

Надеюсь, это помогло.

0

Я знаю, что это старая тема, но я решил, что добавлю свой опыт. Если вы выполняете скрипт через браузер, проблема с таймаутом будет проблемой. Когда я подумал об этом, я понял самое легкое решение, не изменяя настройки сервера, и это нужно использовать AJAX.

Итак, используя jQuery AJAX, вы можете запустить jQuery скрипт PHP для обработки одной фотографии за раз, а затем сообщить о статусе. Вы можете обновить javascript «список» или что-то в этом роде, чтобы вы могли видеть, где он находится во время всех фотографий. Таким образом, это будет выглядеть примерно так: jQuery отправляет команду для обработки следующего файла> PHP обрабатывает файл, затем возвращает отчеты> jQuery обрабатывает ответ, а затем повторяет этот процесс.

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

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