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. Нові додаються, існуючі оновлюються.
    • Скачування зображень на сервер. Це відбувається партіями по 1 000 в 16 потоків. Багатопотоковість реалізовано за допомогою технології cURL Multi. Швидкість завантаження зображень – 1200-1500 за 1 хвилину. Швидкість можна підвищити, але тоді втрачається стабільність – є ризик отримати «биті» картинки нульового розміру. Звичайно, швидкість скачування залежить також і від можливостей веб-сервера.
    • Відключення відсутніх категорій та обнулення відсутніх товарів.
    • Завершення імпорту і формування результатів
  • Первинний імпорт тривав трохи більше 1 години
  • Наступні запуски для актуалізації інформації на сайті тривають не більше 10 хвилин. Якщо нових зображень нема або їх мало, то 3-4 хвилини.

Безумовно, ця реалізація імпорту XML в опенкарт не претендує на звання найправильнішої і найшвидшої, оскільки може бути величезна кількість іншиї способів реалізації імпорту даних, і швидкість може бути вищою – все залежить від конкретної ситуації. Тут такиї підхід себе повністю оправдав, і всі залишились задоволеними результатом.

Якщо Вам потрібен модуль імпорту опенкарт (схожий чи з абсолютно іншим набором функціоналу) для будь-якої версії Опенкарт – звертайтесь до нас, допоможемо опрацювати прайс будь-якої складності.