Теоретические вопросы про изменению размеров изображений на лету

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
GHopper
Сообщения: 83
Зарегистрирован: 2017.06.05, 10:53

Теоретические вопросы про изменению размеров изображений на лету

Сообщение GHopper » 2018.07.28, 17:04

Приветствую.

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

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

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

Код: Выделить всё

        
        $ext = pathinfo($file)['extension'];

        if (file_exists($file)) {
            // return original
            return Imagine::getImagine()
                ->open($file)
                ->show($ext, []);
        }

        preg_match("/(.*)_(\d+)x(\d+)\.{$ext}/", $file, $matches);
        if (is_array($matches) && count($matches)) {
            if (!file_exists("{$matches[1]}.{$ext}")) {
                throw new NotFoundHttpException("Image doen't exist!");
            }

            $options = array(
                'resolution-units' => ImageInterface::RESOLUTION_PIXELSPERINCH,
                'resolution-x' => $matches[2],
                'resolution-y' => $matches[3],
                'jpeg_quality' => 100,
            );

            return Imagine::resize("{$matches[1]}.{$ext}", $matches[2], $matches[3])
                ->show($ext, $options);
        } else {
            throw new NotFoundHttpException('Wrong URL params!');
        }
Вопросы кеширования выносим за рамки данного обсуждения.

Вопрос:
При такой схеме броузер не имеет прямого доступа к изображениям. Т.е. все запросы ведут на специальный контроллер, который отдает содержимое файлов. Но сами файлы по-факту находятся вообще в другом месте и к ним имеет доступ только контроллер.
Насколько это все ресурсоемко и загружает сервер?
Если переделывать алгоритм на сохранение изображений в спец. директории и редиректе броузера на это изображение, то как SEO и время загрузки страницы отреагирует на эти редиректы?

Может я что-то не знаю и существует "старая проверенная" практика решения подобных задачь? Просветите?


dmg
Сообщения: 633
Зарегистрирован: 2012.10.15, 03:09

Re: Теоретические вопросы про изменению размеров изображений на лету

Сообщение dmg » 2018.07.28, 22:37

Я предпочитаю это делать с помощью nginx

pavlm
Сообщения: 82
Зарегистрирован: 2013.09.02, 16:33

Re: Теоретические вопросы про изменению размеров изображений на лету

Сообщение pavlm » 2018.07.28, 23:40

может обрабатывать и кешировать вот этот пакет https://github.com/yii2mod/yii2-image

GHopper
Сообщения: 83
Зарегистрирован: 2017.06.05, 10:53

Re: Теоретические вопросы про изменению размеров изображений на лету

Сообщение GHopper » 2018.07.31, 13:03

Все я делал неправильно!
Вот совет умного человека.

Кратко:
1. Генерация изображений через PHP съедает слишком много ресурсов
2. Перманентные редиректы отнимают слишком много времени
3. Логика решения задачи - создаем публичную директорию, в которой храним обработанные изображения; если изображение существует в директории - броузер получает его по прямой ссылке; если изображения нет, броузер редиректится на специальный скрипт, который генерирует это изображение с нужными параметрами и вновь перидерктится на первоначальный адрес (где изображение уже создано).

pavlm
Сообщения: 82
Зарегистрирован: 2013.09.02, 16:33

Re: Теоретические вопросы про изменению размеров изображений на лету

Сообщение pavlm » 2018.07.31, 13:12

это очевидные факты, все они учтены в пакете yii2mod/yii2-image

GHopper
Сообщения: 83
Зарегистрирован: 2017.06.05, 10:53

Re: Теоретические вопросы про изменению размеров изображений на лету

Сообщение GHopper » 2018.07.31, 14:46

pavlm писал(а):
2018.07.31, 13:12
это очевидные факты
:lol: :lol:
Видимо не все, очевидное для тебя, очевидно для других. Вот и я один из таких не далеких, которые только открыли для себя сию логику. Пусть будет, может кому еще пригодится.

Ответить