Фоновая оптимизация изображений

Быстрые и медленные преобразования

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