Как обновить 40 000 товаров на OkayCMS за секунды и не потерять 120 тысяч рублей на заказах

Это было в четверг, года три назад. У нашего клиента на OkayCMS было около 42 000 товаров — сантехника, насосы, фитинги. Курс евро тогда подпрыгнул на 8%, и нам нужно было срочно пересчитать розницу. Включили стандартный импорт. Скрипт поработал минуты три, словил 504 Gateway Timeout на сервере и тихо умер на середине файла.

Знаете, что произошло дальше? Половина базы обновилась, а половина осталась со старыми ценами. Хуже того, из-за сбоя в сессии затерлись остатки по топовым немецким насосам. Они встали в статус «в наличии» по цене пятилетней давности. За три часа, пока менеджеры пили кофе и не замечали беды, на сайт пришло девять заказов. Убыток на ровном месте — 124 000 рублей. Из своего кармана мы их не платили, но седых волос у меня прибавилось знатно. Клиента мы тогда еле удержали.

Этот факап заставил нас полностью переписать подход к тому, как делается синхронизация цен okaycms. Больше никакого стандартного импорта на больших каталогах.

Почему стандартный импорт OkayCMS — это бомба замедленного действия

Давайте честно. OkayCMS — отличный, легкий движок. Он быстро работает и прост в настройке. Но его архитектура, унаследованная еще от Simpla, не рассчитана на тяжелый enterprise-объем данных. Когда ваш каталог разрастается выше 10 000 позиций, стандартная админка начинает задыхаться.

Стандартное okaycms обновление остатков работает через тяжелый PHP-скрипт. Он парсит CSV-файл строчка за строчкой. На каждую строчку движок делает несколько запросов к базе данных: ищет товар по артикулу, обновляет цену, перезаписывает количество, проверяет связи категорий и брендов. Если у вас 20 000 товаров, сервер делает более 60 000 запросов к MySQL.

Обычный виртуальный хостинг или даже слабенький VPS просто блокирует такие процессы по таймауту. Скрипт падает посередине. База данных остается в промежуточном, разорванном состоянии. Часть цен старая, часть новая, остатки поплыли. Использовать такой метод на живом работающем магазине — это как играть в русскую рулетку. Рано или поздно выстрелит.

Как мы решили эту проблему: транзакции и прямая работа с SQL

Мы в GuardLabs наступили на эти грабли достаточно раз, чтобы выработать жесткий стандарт. Никаких веб-импортов через браузер для больших каталогов. Мы пошли по пути прямой работы с базой данных, но с жестким контролем безопасности.

Правильный алгоритм выглядит так:

Шаг 1: Изоляция процесса. Мы полностью убираем парсинг тяжелых файлов из контекста веб-сервера. Скрипт работает в фоне. Сначала CSV или XML загружается во временную плоскую таблицу в базе данных. Это происходит мгновенно, так как нет никаких проверок связей.

Шаг 2: Транзакционность. Мы не пишем данные в рабочие таблицы по одной строчке. Мы открываем транзакцию через START TRANSACTION. Все обновления цен и остатков происходят в оперативной памяти базы данных единым пакетом. Если в процессе записи произойдет сбой, база просто сделает ROLLBACK. Ни один байт на живом сайте не изменится, пока вся пачка данных не запишется успешно.

Шаг 3: Верификация перед публикацией. Перед финальным подтверждением (COMMIT) наш скрипт проводит автоматический аудит. Он проверяет: совпадают ли контрольные суммы? Не обнулились ли случайно все цены? Не упали ли остатки до нуля по всему сайту? Если проверка пройдена — изменения применяются. Сайт обновляется мгновенно, буквально за полсекунды, без зависаний и тормозов для покупателей.

Такая интеграция okaycms гарантирует, что ваши покупатели никогда не увидят сломанную верстку или нулевые цены.

Автоматизация без ручного труда

Загружать файлы руками каждое утро — это прошлый век. Менеджер забыл, заболел, перепутал файлы — и вот вы снова теряете прибыль. Современный e-commerce требует скорости. Конкуренты меняют цены по API несколько раз в день, подстраиваясь под курс и поставщиков.

Правильная автоматизация okaycms должна работать полностью в фоновом режиме. Робот сам забирает прайс-листы с FTP-сервера поставщика или по ссылке, парсит их, пересчитывает рублевые цены по актуальному курсу валют, округляет копейки и обновляет остатки на сайте каждые 2-3 часа. Без участия человека.

Мы внедрили эту схему десяткам интернет-магазинов. Менеджеры теперь занимаются продажами и клиентами, а не бесконечным копипастом из Excel.

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