Версия 1.0.11
Анимированные GIF конвертируются в анимированный WebP. Это формат, которому есть что
отдать: проверочный баннер весит 9,62 МБ в GIF и 1,75 МБ в WebP той же анимацией —
измерено на клиентском хостинге. Копия остаётся картинкой, поэтому едет тем же путём, что
и остальные, и отдаётся через ту же обёртку, а сам GIF остаётся запасным вариантом.
Требуется Imagick: только он умеет читать все кадры, поэтому на серверах без него гифки
просто пропускаются. Анимации ставятся в очередь последними и не берутся в работу там,
где посетитель ждёт ответа. Для них добавлен отдельный фоновый прогон на экране "Очередь" —
одна анимация готовится столько же, сколько сотня обычных картинок, и в общем прогоне они
мешали бы друг другу. Предел размера исходного файла по умолчанию поднят с 8 до 12 МБ:
именно он отсекал такие баннеры.
Появилась галочка "Отдавать WebP напрямую, без обёртки picture". Обычная доставка
оборачивает картинку в тег picture, чтобы браузер без поддержки формата получил оригинал,
но при этом картинка становится на уровень глубже в разметке — и на некоторых шаблонах
перестают работать стили вида ".карточка > img" и скрипты галерей и слайдеров, которые
ищут картинку через родителя. С галочкой адрес копии подставляется прямо в src, разметка
не меняется вовсе. Фоны в стилях отдавались напрямую всегда, поэтому включённая галочка
приводит к общему виду всю отдачу. Копия предлагается только браузерам, заявившим
поддержку формата.
Исправлено: подстановка фона могла испортить разметку. Если адрес в стиле был записан с
экранированными кавычками, после подстановки они возвращались настоящими и обрывали
атрибут — элемент терял фон. Теперь значение кодируется обратно, а результат сверяется с
задуманным на готовой странице.
Исправлено: подготовка копий могла оборвать страницу. Пределы в настройках противоречили
друг другу — картинка в 40 мегапикселей требует больше памяти, чем модулю разрешено
занимать, а нехватка памяти обрывает страницу целиком. Теперь потребность считается до
начала работы и сверяется с тем, что процессу действительно доступно.
Исправлено: после правки файла скрипта сайт продолжал отдавать старую сжатую копию.
Копия выбиралась по адресу файла, а не по его содержимому, поэтому исправленный скрипт
никогда не пересобирался. Теперь размер и время файла решают, годится ли копия, и правка
приводит к пересборке.
Исправлено: подменялись адреса скриптов самого Битрикса. Это ломало штатное правило ядра
"один адрес — одна загрузка" при подгрузке компонентов и оставляло устаревшие копии
служебных сборок. Теперь такие файлы не трогаются.
Исправлено: на экране настроек модуля часть числовых пределов была шире рабочих. Можно
было указать, например, 50 задач за один проход фонового агента, хотя берётся не больше
десяти, — число сохранялось и молча урезалось. Теперь верхние границы на экране совпадают
с теми, что модуль действительно соблюдает, а значение, сохранённое прежней версией выше
новой границы, показывается уже в допустимых пределах.
Укрепление по итогам предрелизной проверки. Анимация собирается во временном каталоге,
имя которого нельзя предсказать со стороны, — на общем хостинге это защищает от подмены
файла соседом по серверу. Проверка "поместятся ли кадры" больше не отключается на
серверах, где у ImageMagick не выставлены пределы: раньше именно там специально
подготовленный GIF мог занять сервер надолго. Кроме того, GIF читается не целиком, а в
пределах разрешённого размера, и нестандартное значение memory_limit больше не приводит
к ошибке в середине конвертации.
Большие каталоги обрабатываются во много раз быстрее. Очередь пополнял только фоновый
агент — не больше десяти задач в минуту и лишь пока на сайте кто-то есть, — поэтому
CLI-воркер, способный на сотню за проход, простаивал за очередью, которая наполнялась
десятью. Теперь очередь пополняет тот, кто её разгребает, и воркер берёт настройки сайта,
а не собственные умолчания. На экране "Очередь" появился блок "Прогон по расписанию" с
готовой строкой для планировщика: с путями вашего сайта и тем PHP, на котором сайт
работает. Строку можно запускать в несколько потоков — задача достаётся ровно одному.
Замер: 25 картинок за 3,8 секунды одним потоком против трёх в минуту у агента.
Исправлено: прогон по каталогу не мог переделать то, от чего однажды отказались. Очередь
при повторной постановке возвращала уже существующую задачу в любом состоянии, включая
завершённую впустую, — поэтому прогон шагал по каталогу, отчитывался и не ставил ничего.
Установка Imagick, поднятие предела размера или перезапуск прогона не помогали никогда.
Теперь завершённая задача для файла без копии возвращается в работу.
Исправлено: длинную конвертацию отбирали у того, кто её делал. Аренда задачи длилась
минуту, а конвертация большой анимации идёт дольше, и уборщик зависших задач передавал её
другому — работа выбрасывалась и начиналась заново, три раза, после чего файл считался
неконвертируемым. Аренда теперь переживает весь проход.
Исправлено: анимации не записывались на хостинге, где сайт заперт в своём каталоге
(open_basedir). Системный временный каталог там недоступен, а копия писалась именно туда.
Теперь запись идёт во временную папку самой CMS внутри сайта.
Исправлено: картинки с пробелами и кириллицей в имени не оптимизировались вовсе. Адрес
приходит в закодированном виде, а на диске имя обычное — файл искали под именем, которого
нет, и промах выглядел как попытка выйти за пределы сайта.
Исправлено: сервер с настроенной ImageMagick больше не занижается модулем. Прежде модуль
опускал её пределы до своих, и на сервере, где разрешён гигабайт памяти, это загружало
дисковый слой вместо того, чтобы разгрузить его: анимация на 204 кадра упиралась в предел
диска. Свои числа модуль теперь ставит только там, где у сборки нет никаких, и умеет их
поднять; упёршись в чужой потолок, он отказывается один раз и называет цифры.
Исправлено: прогресс прогона считал не то. Оба прогона читали все картинки подряд, а
"всего" считалось только по своему виду — сайт с сорока анимациями среди пятисот картинок
показывал "116 из 40" и продолжал расти, что выглядит как зависший прогон.
Исправлено: анимации оставались без копий при включённой галочке прямой отдачи. Логика
исключала их целиком — у GIF в этом режиме не остаётся запасного варианта, — и копии
строились, но не доходили ни до кого. Теперь обычные картинки идут прямо в src, а
анимации получают обёртку picture: она появляется только вокруг них.
Предел размера копии по умолчанию поднят с 8 до 12 МБ — до того же значения, что и предел
исходника. Копия и так сохраняется только если она меньше оригинала, поэтому отдельный
меньший предел отбрасывал уже сделанную работу.
Мелкое: версия модуля на экранах теперь берётся из работающего кода, а не из записи
установщика, которая после обновления оставалась прежней; воркер, опустошивший очередь,
так и пишет, а не сообщает об упоре в лимит.
Исправлено: атрибуты, записанные одинарными кавычками или без кавычек, читались как
пустые. Такие картинки и скрипты модуль просто не видел — не сжимал, не откладывал, не
измерял. Ничего при этом не ломалось, поэтому и не бросалось в глаза: на шаблоне,
свёрстанном так, модуль молча не делал ничего.
На экране настроек появилась галочка «Обработчик очереди по расписанию». Раньше экран
«Очередь» показывал строку для планировщика и сообщал, что нужно включить обработчик, а
включить его было негде.