Фоновая оптимизация изображений
Быстрые и медленные преобразования
sGallery сначала обрабатывает изображения без кеша синхронно. Типовой
кооперативный бюджет — пять секунд; его задаёт пакет, значение доступно через
Seiger\sGallery\sGallery::optimizationBudgetSeconds(). Готовый непустой кеш
возвращается сразу; пустые файлы генерируются заново.
Автоматический подбор качества WebP сохраняет 15 кандидатов:
99, 97, 95, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 82, 80.
Выбирается первый кандидат, укладывающийся в целевой размер, либо последний,
если ни один не подошёл. Явный quality() использует одно заданное значение
с существующей нормализацией верхней границы WebP до 99.
Только завершённый непустой WebP атомарно публикуется из временного файла.
Бюджет проверяется между преобразованиями и попытками кодирования. Он не может прервать уже работающий native encoder: первая обработка может превысить пять секунд или действующий PHP timeout. Отметка медленного преобразования хранится в общем storage, и следующие запросы пропускают синхронную обработку. Незавершённые временные файлы не выдаются как готовые изображения.
Необязательная интеграция sTask
Пакет устанавливается независимо. Для передачи в очередь нужны установленные
runtime-классы sTask, API heartbeat() и актуальный heartbeat runner-а.
Старые версии sTask без этого API не получают отложенные задания.
Воркер — Seiger\sGallery\Workers\ImageOptimizationWorker, идентификатор —
sgallery.image-optimization, действие — optimize. Первое отложенное задание
регистрирует отсутствующий воркер активным. Существующий отключённый воркер
не включается автоматически: разрешите выполнение в менеджере sTask.
После исчерпания бюджета фронт возвращает URL оригинала. Если sTask недоступен, heartbeat просрочен или постановка в очередь не удалась, оригинал остаётся доступным, а дорогое преобразование не повторяется в каждом запросе. Уже открытое изображение не заменяется автоматически. После успешного задания воркер очищает кеш страниц и Blade views Evolution, чтобы последующие запросы использовали готовое изображение. Кеш производных изображений не очищается.
Идентичность задания и восстановление
Задание сохраняет путь источника, его размер и время изменения, выбранный формат, параметры преобразования и настройки явного качества. Удалённые источники не попадают в очередь. Изменение источника во время ожидания отклоняет старое задание. Неблокирующий lock для задания и дедупликация sTask предотвращают дубликаты. После ошибочного или завершённого задания без пригодного кеша повторная постановка имеет паузу пять минут; активные задания используются повторно.
Служебные файлы находятся в storage/sgallery/optimization. Storage должен
быть общим между релизами и доступным для записи фронтовому и CLI пользователям.
CLI воркер отключает PHP execution-time limit для этих заданий; инфраструктурные
таймауты и ограничения памяти сохраняются. Прерванное задание не публикует
завершённый WebP-кеш.
Проверка
Запустите интеграционные тесты с Composer runtime установленного Evolution, sTask с heartbeat API, поддержкой GD/WebP и SQLite:
SGALLERY_AUTOLOAD=/path/to/site/core/vendor/autoload.php php tests/image-optimization.php
php tests/optional-stask.php