Кеширование динамических изображений в Rails - PullRequest
4 голосов
/ 01 декабря 2009

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

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

Есть ли лучшая практика для кэширования образа или записи его на диск вместо динамической генерации для каждого запроса? После генерации эти изображения останутся в основном статичными, но я также хотел бы, чтобы опция воссоздала их через определенный промежуток времени.

Ответы [ 3 ]

5 голосов
/ 02 декабря 2009

Рекомендуется кэшировать сгенерированные изображения и разрешать их обслуживать веб-сервер.

Используйте веб-сервер, такой как Apache или Nginx, перед своим приложением Rails и убедитесь, что вы записали изображение в место, где веб-сервер может его обслуживать. Поэтому, если ваш маршрут Rails оценивается как /dynamic_images/3.png (что вызывает dynamic_images_controller action show с id = 3 и format = png), запишите это изображение в public/dynamic_images/3.png и используйте send_file в контроллере для его отправки.

В следующий раз, когда этот файл будет запрошен (/dynamic_images/3.png), веб-сервер с радостью будет обслуживать его (кэшировать), и приложение Rails никогда не получит доступ.

Для более сложных задач, таких как повторная генерация изображений и очистка кода контроллера, взгляните на скрепку gem.

2 голосов
/ 12 августа 2011

Просто идея (никогда не пробованная): почему бы не хранить изображения (особенно те, которые генерируются динамически) с помощью memache?

Rails.cache.write ("MY_IMAGE", изображение)

1 голос
/ 01 декабря 2009

Вы должны поместить кэшированные изображения в такой каталог, откуда они будут обслуживаться веб-сервером. Вы не хотите использовать send_data для этого - это слишком медленно. Кроме того, вы, вероятно, захотите игнорировать этот каталог в вашей VCS.

...