Организация генерации миниатюр в PHP

Рейтинг: 0Ответов: 1Опубликовано: 20.04.2015

Дано: некое PHP-приложение, куча картинок, используется некий шаблонизатор.

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

Как это "обычно" делается:

Есть некая функция resize(image, size), которая реализует масштабирование картинки так как нам нужно.
В шаблоне имеем что-то вроде { resize source_image 100x100 }, что в свою очередь делает следующее:

  1. Строит путь до миниатюры thumb_file_path.
  2. Пытается найти thumb_file_path на диске.
  3. Если файл не существует физически генерирует картинку resize(source_image, 100x100)
  4. Возвращает URL, соотвтетсующий thumb_file_path.

Недостатки данного подхода, от которых хотелось бы избавиться

  1. Каждый запрос на каждой миниатюре не дёргать файловую систему с проверкой наличия миниатюры.
  2. При обновлении исходного изображения, его миниатюры должны "прозрачно" обновляться.
  3. Возможность физической генерации после отдачи страницы юзеру.

А также

  • Сами миниатюры должны отдаваться веб-сервером, PHP только URL'ы выдаёт.

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

  • Сгенерировать картинку нужно с помощью resize() - сторонние генераторы не подходят.

Ответы

▲ 3

В memcache хранить картинки - это ещё тот изврат. Или не это имелось ввиду?

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

Более детально в архитектуру. Для картинок я бы выделил отдельный поддомен (что то вида img.yoursite.com). Это позволит запустить nginx прям на основной машине. Пока нагрузка будет маленькой - этого будет достаточно. Когда нагрузка выростет, можно будет перенести это все на отдельный сервер и только поправить запись в dns. Также, если все это будет на отдельном домене/вебсервере (пусть даже на одной физической машине), это позволит более точно все настроить (что бы конвертация картинок не съедала все ресурсы).