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

Швидкі та повільні перетворення

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