Как реализовать ресайз изображений на лету средствами php?

День добрый!

Возник вопрос по оптимизации процесса ресайза изображений, средствами php на лету. Ссылка на ресайз выгляди так:

localhost/$controller/$config/$token/$image->id.$image->format

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

Нужно сделать такой момент, если вдруг хранилище отвалилось и картинок нет, то отдается картинка-заглушка. И естественно она попадает в кеш Nginx-а, и даже когда картинки появляются, все равно отдается кеш, и приходится его чистить, а это создает существенную нагрузку.

Подскажите, пожалуйста, кто как решает подобную ситуацию?
  • Вопрос задан
  • 4879 просмотров
Решения вопроса 2
@kaasius
Это можно решить на уровне nginx c помощью try_files и X-Accel-Redirect, вообще без кеша.
Например, так:
location <локейшен с картинками>{
    try_files $uri @resize;
}
location @resize {
    proxy_pass http://<адрес ресайзера с параметрами>;
}
location /notexist.gif {
    root /path/to/notexist/folder;
}


Тогда энджи сначала попытается найти файл (ресайзер должен его сохранить там перед отдачей), если не найдет - попробовать отресайзить (запустится ресайзер, который, напомню, должен сохранить картинку на диск перед отдачей), а если ресайзер не нашел исходную картинку - ему надо вернуть X-Aссel-Redirect заголовок с uri /notexist.gif

Подробнее про X-Accel можно почитать тут wiki.nginx.org/X-accel

Использовать же для этого кеширование энджи - неправильный путь, ибо вы получите недетерминированный результат.
Ответ написан
Комментировать
ptchol
@ptchol
Linux system administrator
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы