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

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

Хочете таке саме для свого бізнесу?

Ми робимо такі демо і впроваджуємо під ваш процес — залиште заявку, відповімо швидко.

Дякуємо — заявку отримано, відповімо найближчим часом.