Menu
Корзина

Импорт XML

Импорт XML
Импорт XML
Импорт XML
Импорт XML
Импорт XML
2.x
Импорт XML
Импорт XML
Импорт XML
Импорт XML
Импорт XML
Импорт XML
$0.00
    Просмотров: 1140
    Купить
    Совместимость
    Версия OpenCart2.3

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

    Для решения подобных задач существуют различные модули, которые специализируются на обработке какого-нибудь формата: 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 в опенкарт, конечно же, не претендует на звание самой правильной и самой быстрой, поскольку может быть огромное количество других способов реализации импорта данных, и скорость может быть выше – всё зависит от конкретной ситуации. Здесь такой подход себя полностью оправдал, и все остались довольны результатом.

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

    Написать отзыв

    Примечание: HTML разметка не поддерживается! Используйте обычный текст.
    Плохо Хорошо
    Защита от роботов