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



Фрагмент прогрітої сітки категорії, реальні файли з images/thumbnails/200/200/ цього прогону. Каталог синтетичний, згенерований для стенда, що чесно написано на кожній картці:
curl -sI https://guardlabs.online/demo/cscart-thumbs/thumbs/product_001.jpg поверне 200 і content-type image/jpeg.?:images_links, запуск у cron щоночі та одразу після clear cache.