Кешируем превью (Thumbnail)

При разработке последнего проекта, при выводе шаблона нужно было показывать большое количество превь-картинок (thumbnails). Самым быстрым решением было сжимать картинки до нужных размеров на лету . Но такой подход не очень хорош с точки зрения производительности скрипта.

Есть у Symfony очень хороший плагин для генерации превью – sfThumbnailPlugin, но есть одно свойство плагина, затрудняющее его использование – превью нужно генерировать или при загрузке файла на сервер или же по запросу. Идеально если б превью создавалось при первом обращении к картинке, а при последующих обращениях отдавался бы созданный файл.

Для этого возьмем снипет:

function getThumbnail($image,$width=null,$height=null, $scale = true, $inflate = true, $quality = 75)
{
    $image_dir=dirname($image);
    $image_file=basename($image);
    $thumbnail_dir='';
    if ($width>0) $thumbnail_dir.=$width;
    if ($height>0) $thumbnail_dir.='x'.$height;
    if ($width>0 || $height>0) $thumbnail_dir.='/';
    if (!file_exists(sfConfig::get('sf_upload_dir').'/'.$image_dir.'/'.$thumbnail_dir.$image_file) && ($width!=null || $height!=null))
    {
      if (!is_dir(sfConfig::get('sf_upload_dir').'/'.$image_dir.'/'.$thumbnail_dir))
      {
        mkdir (sfConfig::get('sf_upload_dir').'/'.$image_dir.'/'.$thumbnail_dir,0777);
      }

      $thumbnail = new sfThumbnail($width, $height,$scale,$inflate,$quality);
      $thumbnail->loadFile(sfConfig::get('sf_upload_dir').'/'.$image_dir.'/'.$image_file);
      $thumbnail->save(sfConfig::get('sf_upload_dir').'/'.$image_dir.'/'.$thumbnail_dir.$image_file);
    }
    return '/uploads'.'/'.$image_dir.'/'.$thumbnail_dir.$image_file;
}

Этот код ложим в файл myapp/lib/ThumbnailHelper.php и добавляем в модель вот такой код:

public function getThumbnail($img=null,$width=null,$height=null)
  {
    sfLoader::loadHelpers('Thumbnail');
    return getThumbnail('images/'.$img,$width,$height);
  }

Дальше, в представлении можно писать следующее:

image_tag($item->getThumbnail($item->getImg(), 150,120))

где $item – экземпляр класса, в модель которого мы добавляли код, getImg() – функция, возращающая путь к изображению.

Теперь при обращении к картинке, создается превью и кладется в каталог, соответствующий размеру.

Теги: , ,

Вы можете оставить комментарий или подписаться на RSS feed

Коментарии

А почему бы не попробовать эту штучку сделать фильтром? По-моему, это как раз для фильтров работа.

Врядли. Тут важно принудительно из вьюса вызывать функцию

У меня symfony 1.1 и этот замечательных плугин не работает :(

есть какой-то монстровый аналог под названием sfMediaLibrary, который тоже умеет тумбнайлы делать. Но он глючный, недоделанный.

Есть ли что-то полегче?
М.б., возможно и вручную как-то сделать тумбнайлы?

Оставить комментарий

(обязательно)

(обязательно)