Workspace Digital Awards — приём заявок открыт! Успейте номинироваться по самой низкой цене. Повышение цен с 1 октября.
Дмитрий Гапонов
Товарные выгрузки и карта сайта на 800 тысяч позиций - 22 секунды вместо девяти часов
Дмитрий Гапонов
#Программирование сайта

Товарные выгрузки и карта сайта на 800 тысяч позиций - 22 секунды вместо девяти часов

Дмитрий Гапонов Россия, Новосибирск
Поделиться: 0 0 0
Сфера

Электронная коммерция

Сдано

Август 2026

Задача

Магазин рекламировался товарными выгрузками, и рекламная система их не принимала. Файлы лежали от первого июня, вдвое старше допустимого возраста, в них не было ни цен, ни картинок, ни признака наличия. Карта сайта вела на адреса старого вида, и каждая ссылка отдавала редирект.

Причина, по которой всё это не обновлялось, оказалась не в лени владельца. Штатный модуль выгрузки собирал восемь тысяч товаров за 184 секунды, то есть на полный каталог ему нужно около девяти часов - он строил адрес каждого товара отдельным запросом. Такой прогон по ночам не встанет ни на какое расписание, и обновление держалось на ручном запуске, последний раз в июне.

Решение

Отказался от штатного модуля и написал свой выгрузчик прямым запросом к базе - весь каталог за 22 секунды и два мегабайта памяти.

Формулу адреса товара выяснил по коду модуля человекопонятных адресов и проверил на живых страницах. Адрес складывается из ключей всех родительских категорий и ключа товара с постфиксом, а главная категория выбирается тем же правилом, что внутри самого модуля. Шестьдесят шесть случайных адресов и картинок из готовых файлов проверил запросами, все ответили 200.

В выгрузку заложил адрес, цену, валюту, категорию, оригинал картинки из папки изображений, самовывоз и доставку, название, производителя, описание с вырезанными тегами и обрезкой, признак наличия. Габаритов и веса в базе нет ни у одного товара, поэтому теги не выводятся вовсе - раньше там лежал мусор вида 0E-8.

Почти десять тысяч товаров в наличии не привязаны ни к одной категории, а рекламная система требует категорию обязательно. Собрал их в служебную ветку, чтобы они не выпали из рекламы совсем, и написал владельцу, что правильнее разложить их по категориям в админке.

Формат даты оставил тот, что писал штатный модуль, хотя документация просит другой. Именно его рекламная система разбирала без нареканий, а ругалась она на возраст файлов. Менять проверенное ради соответствия документации смысла нет.

Уборка за собой вскрыла две дыры. Файл рядом со скриптом спокойно скачивался снаружи, хотя папка закрыта правилами - веб-сервер отдаёт статику мимо обработчика этих правил. И заливка по FTP сама кладёт рядом копию прежней версии, а для веб-сервера это обычная статика, то есть исходник скрипта с ключами доступа отдавался кому угодно. Обе закрыл переименованием, промежуточные папки сборки убрал из корня сайта.

Результат

Двадцать две выгрузки и двадцать две карты сайта плюс индекс. В выгрузках 431 302 предложения только в наличии против миллиона с лишним мёртвых строк, в карте 801 028 адресов нынешнего вида. Всё встало на ночное расписание, дата в файлах теперь всегда свежая. Проверку перед сдачей гонял внешними запросами и запускал самой строкой расписания, чтобы проверялось ровно то, что работает. Прежние файлы целиком уехали в резервную папку - 45 файлов и 1,7 ГБ, ничего не удалено.


Стек технологий


Оцените кейс
Спасибо за оценку
Выскажите мнение
Авторизуйтесь, чтобы добавить свой комментарий.
оставить заявку

Хотите заказать похожий проект?

Оставить заявку