создание эскизов для 8000+ изображений - PullRequest
0 голосов
/ 01 августа 2011

Некоторое время назад я и некоторые из моих друзей устроились и создали наш собственный хостинг / файлообменник, который мы используем для внутреннего пользования (в частном порядке). Это не публичный сервер или что-то не так, как он предназначен исключительно для нашего использования.

Вся вещь размещена на следующих спецификациях.

  • Процессор: AMD Phenom II X4 (модель: 955) @ 3,20 ГГц
  • RAM: 8 ГБ
  • ОС: Windows Vista Home Premium @ 64 бит
  • HDD: x2 1 ТБ, SATA

Требуется немного времени для работы с файлами, не говоря уже о том, что php.ini пришлось переписывать совсем немного, чтобы почти 1 ГБ памяти было выделено для скрипта и увеличилось время выполнения до 400 секунд.

ВОПРОС:
Таким образом, спецификации достаточно хороши, чтобы справиться с нагрузкой, но есть лучший способ оптимизировать код, представленный ниже, чтобы он мог работать с 8000+ изображениями и не отставать от системы ? Не говоря уже об остановке после просмотра более 500 файлов.

А вот код самого скрипта.

function make_thumb($src,$dest,$desired_width) {
  /* read the source image */
  $de_width = 100;
  $source_image = imagecreatefromjpeg($src);
  $width = imagesx($source_image);
  $height = imagesy($source_image);
  /* find the "desired height" of this thumbnail, relative to the desired width  */
  $desired_height = floor($height*($desired_width/$width));
  /* create a new, "virtual" image */
  $virtual_image = imagecreatetruecolor($desired_width,$desired_height);
  /* copy source image at a resized size */
  imagecopyresampled($virtual_image,$source_image,0,0,0,0,$desired_width,$desired_height,$width,$height);
  /* create the physical thumbnail image to its destination */
  imagejpeg($virtual_image,$dest,75);
}

function get_files($images_dir,$exts = array('jpg','png','gif','jpeg')) {
  $files = array();
  if($handle = opendir($images_dir)) {
    while(false !== ($file = readdir($handle))) {
      $extension = strtolower(get_file_extension($file));
      if($extension && in_array($extension,$exts)) {
        $files[] = $file;
      }
    }
    closedir($handle);
  }
  return $files;
}

/* function:  returns a file's extension */
function get_file_extension($file_name) {
  return substr(strrchr($file_name,'.'),1);
}

$images_dir = 'data/'.$key.'/photos/';
$thumbs_dir = 'data/'.$key.'/photos/f/';
$thumbs_width = 100;
$images_per_row = 6;

/** generate photo gallery **/
$image_files = get_files($images_dir);
if(count($image_files)) {
  $index = 0;
  foreach($image_files as $index=>$file) {
    $index++;
    $thumbnail_image = $thumbs_dir.$file;
    if(!file_exists($thumbnail_image)) {
      $extension = get_file_extension($thumbnail_image);
      if($extension) {
        fm_thumb($images_dir.$file,$thumbnail_image,$thumbs_width);
      }
    }
    echo '<a href="',$images_dir.$file,'" rel="gallery"><img src="',$thumbnail_image,'" class="photo-link"/></a>';
    if($index % $images_per_row == 0) { echo '<div class="clear"></div>'; }
  }
  echo '<div class="clear"></div>';
}
else {
  echo '<p>There are no images in this gallery.</p>';
}

1 Ответ

0 голосов
/ 01 августа 2011

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

Вы можете использовать shell_exec('console command here') для выполнения процесса.

http://php.net/manual/en/function.shell-exec.php

...