Menu
Корзина

Импорт XML

Перед владельцем интернет-магазина на опенкарт рано или поздно возникает вопрос: как и чем обработать прайс (или прайсы) поставщика, чтоб оперативно и корректно обновить или добавить товары в опенкарт?

Для решения подобных задач существуют различные модули, которые специализируются на обработке какого-нибудь формата: csv, yml и т.п. Существуют также и модули, которые могут обрабатывать прайсы различных форматов и произвольной структуры, но даже они не могут охватить все возможные сценарии работы с прайсами. Кроме того, такие «комбайны», зачастую, имеют избыточный функционал и достаточно сложный интерфейс.

Для импорта нестандартного прайса лучше создать отдельный модуль: стабильный, быстрый, предсказуемый и не перегруженный настройками.

Данный модуль импорта был написан для Opencart 2.3 по индивидуальному заказу. Он предназначен для импорта большого количества товаров и категорий из xml-файла нестандартной структуры (не вписывается в стандарты прайс-агрегаторов).

Что имеем:

  • Размер xml-файла: около 50Mb
  • Количество категорий: более 25 000
  • Количество товаров: более 55 000
  • Количество изображений: более 170 000 общим объёмом около 15Gb

Что необходимо:

  • Ручной режим запуска импорта с возможность брать файл по ссылке
  • Отображение процесса обработки
  • Скачивание новых изображений
  • Разумное время обработки прайс-листа
  • Возможность задать категориям с одинаковыми названиями одинаковые изображения (структура сайта построена на категориях – многие подкатегории имеют одинаковые названия)
  • Возможность задать категориям выше первого уровня специальную схему (вид корневых и дочерних категорий на сайте отличается)
  • Обновлять цены и остатки товаров
  • Отключать категории, которых нет в текущем прайсе
  • Обнулять товары (количество = 0), которых нет в текущем прайсе

Главной проблемой при обработке больших прайсов является, конечно же, скорость. Она зависит от множества факторов: от конфигурации сервера до структуры и количества mysql-запросов в процессе импорта. В данном случае, проблема скорости была связана с большим количеством изображений, которые нужно скачивать. Если скачивать изображения товара непосредственно во время обработки этого товара, то процесс импорта будет длиться несколько часов (в лучшем случае), в худшем – завершится ошибкой из-за ограничений сервера на время ожидания.

Распространённая ошибка при решении подобных задач – это последовательная обработка всего и сразу (за один запуск скрипта). Такой подход может создавать чрезмерную нагрузку на сервер, а также значительно увеличивается риск получения различных ошибок (Maximum execution time, 504 Gateway Timeout, Allowed memory size и др.). Самый простой способ избежать таких ошибок – использовать технологию AJAX и обрабатывать данные «порциями», а не все за раз. Более того, благодаря асинхронности, данные обрабатываются в несколько потоков, что существенно увеличивает скорость выполнения по сравнению с обработкой «всего сразу».

Что получилось в итоге:

  • Взаимодействие пользователя с сервером происходит с помощью технологии AJAX.
  • Есть возможность назначить схему подкатегориям.
  • Есть возможность назначить изображение по имени категории.
  • Отображается прогресс текущей операции.
  • Процесс импорта происходит в несколько последовательных этапов:
    • Парсинг файла и формирование массива данных, которые необходимо обработать.
    • Импорт категорий. Новые добавляются, существующие обновляются. Каждая «порция» данных, отправляемых на сервер, – это корневая категория со всеми дочерними категориями. То есть, если есть 20 корневых категорий – будет 20 асинхронных ajax-запросов на сервер.
    • Обработка взаимосвязей категорий (делать это отдельным запросом гораздо быстрее, чем при обработке каждой категории).
    • Импорт товаров партиями по 10 000. Новые добавляются, существующие обновляются.
    • Скачивание изображений на сервер. Это происходит партиями по 1000 штук в 16 потоков. Многопоточность реализована с помощью технологии cURL Multi. Скорость загрузки изображений – 1200-1500 за 1 минуту. Скорость можно поднять ещё выше, но тогда теряется стабильность – есть риск получить «битые» картинки с нулевым размером. Разумеется, скорость скачивания зависит также и от возможностей веб-сервера.
    • Отключение отсутствующих категорий и обнуление отсутствующих товаров.
    • Завершение импорта и формирование результатов.
  • Первичный импорт длился немного больше 1 часа
  • Последующие запуски для актуализации информации на сайте длятся не более 10 минут. Если новых изображений нет или их мало, то 3-4 минуты.

Эта реализация импорта XML в опенкарт, конечно же, не претендует на звание самой правильной и самой быстрой, поскольку может быть огромное количество других способов реализации импорта данных, и скорость может быть выше – всё зависит от конкретной ситуации. Здесь такой подход себя полностью оправдал, и все остались довольны результатом.

Если Вам необходим модуль импорта опенкарт (подобный или с совершенно другим набором функционала) для любой из версий опенкарт – обратитесь к нам, поможем обработать прайс любой сложности.