guardlabs
Наш власний тестовий стенд, не клієнтський проєкт
CS-Cart / image pipeline

Мініатюри товарів без холодного старту

CS-Cart генерує мініатюри ліниво: файл images/thumbnails/<W>/<H>/detailed/... з'являється лише тоді, коли його вперше запросив відвідувач. Після «Clear cache» або зміни розмірів у темі весь каталог знову холодний, і перші перегляди сторінок платять за GD-генерацію кожної картки. Ми зібрали інструмент, який прогріває кеш заздалегідь.

25.9 мс
холодна генерація однієї мініатюри (лінивий шлях CS-Cart)
0.01 мс
віддача тієї ж мініатюри з прогрітого кешу (статика nginx)
~1988x
різниця, виміряна на цьому стенді: 240 мініатюр, 80 товарів, 3 розміри
ХОЛОДНИЙ КЕШ
620 мс
ПРОГРІТИЙ
<1 мс
Ціна тільки картинкової роботи на першому перегляді категорії з 24 картками. Виміряно цим стендом, лог нижче.

Де саме болить у CS-Cart

1

Лінива генерація

Запит мініатюри, якої ще немає, провалюється у PHP: fn_generate_thumbnail декодує оригінал, ресайзить через GD або ImageMagick і тільки потім віддає файл. Перший відвідувач чекає.

2

«Clear cache» скидає все

Адмін чистить кеш або змінює розміри мініатюр у налаштуваннях теми, і тисячі файлів у images/thumbnails/ зникають. Каталог знову холодний саме тоді, коли на нього ллється трафік.

3

CPU-піки та повільний TTFB

Промо-розсилка приводить хвилю відвідувачів на холодний кеш: сервер займається ресайзом замість продажів. Googlebot теж ходить холодними мініатюрами і записує поганий TTFB у Core Web Vitals.

Що зроблено на стенді

CLI-інструмент thumb_warmup.php повторює конвеєр CS-Cart: та сама схема шляхів images/thumbnails/<W>/<H>/detailed/<pack>/, ресайз зі збереженням пропорцій, три розміри теми (200, 500, 80). На живому магазині список картинок береться з БД (?:images_links), місце під цей запит у коді позначено.

# прогріти все, що відсутнє (ставимо у cron після кожного clear cache):
php thumb_warmup.php --warm

# повний бенчмарк: purge, холодна генерація, тепла віддача:
php thumb_warmup.php --bench

# реальний вивід цього стенда (повний лог: bench_report.txt):
240 thumbnails in 6.22s => 25.9 ms per thumbnail
=> first view of a 24-card category page pays ~0.62s of image work alone
240 thumbnails (1.3 MB) read in 0.003s => 0.01 ms per thumbnail
RESULT: cold lazy generation is ~1988x slower than serving a warmed cache.

Живі артефакти цього прогону

Ланцюжок розмірів одного товару, згенерований інструментом на цьому сервері:

Оригінал товару 1200 на 1200 пікселів
оригінал 1200px
Мініатюра 500 на 500 для сторінки товару
500px, сторінка товару
Мініатюра 200 на 200 для сітки категорії
200px, сітка категорії

Фрагмент прогрітої сітки категорії, реальні файли з images/thumbnails/200/200/ цього прогону. Каталог синтетичний, згенерований для стенда, що чесно написано на кожній картці:

Синтетичний товар SKU-001 Синтетичний товар SKU-006 Синтетичний товар SKU-011 Синтетичний товар SKU-016 Синтетичний товар SKU-021 Синтетичний товар SKU-026 Синтетичний товар SKU-031 Синтетичний товар SKU-036 Синтетичний товар SKU-041 Синтетичний товар SKU-046 Синтетичний товар SKU-051 Синтетичний товар SKU-056 Синтетичний товар SKU-061 Синтетичний товар SKU-066 Синтетичний товар SKU-071 Синтетичний товар SKU-076

Як перевірити самостійно