Николай Ланец
14 июля 2013 г., 12:23

Ajax-овый импортер на десятки и сотни тысяч товаров.

Я недавно выкладывал на ютуб ролик (смотрим под катом), в котором демонстрировал этот импортер, и вот кратко здесь про него напишу.
Для начала задача: выполнить импорт 13 000 товаров (и не просто импорт, а еще и с проверкой существующих товаров, разделов и т.п., и обновлением остатков и цен, если товар уже есть, а еще и отметкой «нет в наличии» тех товаров, которые уже есть в каталоге, но которых нет в файле импорта), при чем так, чтобы уложиться в 30 секунд и 64 Mb памяти.
В общем, я сразу решил, что в такие рамки не уложиться, и что надо написать такой модуль, который работал бы в цикле (пока задача не будет выполнена), при этом, чтобы вся логика полностью рулилась на стороне сервера. В общем, вот это как раз и есть такое решение (чуть подробней в ролике). Отмечу только, что это дело очень похоже на стандартный компонент MODx.Console, но это не он. Нативный компонент я попробовал, но отмел из-за того, что он только асинхронные запросы отправляет, не дожидаясь ответа. В общем, морду писал сам.
Добрый день, Николай. А чем именно не понравился стандартный компонент MODx.Console? Я делал на нем импорт 300 000 позиций и нареканий с ним не было. Конечно там может перекосить регистры, на которых он, собственно, и работает, но в целом компонент мне показался довольно стабильным.
Добрый день.
А чем именно не понравился стандартный компонент MODx.Console?
1. Тем, что он запросы шлет асинхроннонные, и не дожидаясь ответа, шлет новый запрос. (возможность переключить провайдер в синхронный режим я не нашел. Если вы знаете как, поделитесь, полезно будет). 2. Слишком хитрая система записи логов в файлы и чтения ответов из них. По-моему избыточная сложность.
Я ранее уже делал импортер с использованием стандартной консоли MODX-а ( www.youtube.com/watch?feature=player_detailpage&v=fpkfFbInV88#t=44s ), и хочу сказать, что второй вариант мне показался более простым и гибким.
То есть реальных проблем со стандартной консолью не было, просто свое решение задачи?
(возможность переключить провайдер в синхронный режим я не нашел. Если вы знаете как, поделитесь, полезно будет).
Нет, я ничего подобного в коде не видел, когда мне нужен был этот компонент. Чтобы все это дело заставить дожидаться ответа действительно придется переписывать консоль. А вы как обошлись без передачи логов через файлы между работающим скриптом импорта и Javascript-формой?
То есть реальных проблем со стандартной консолью не было, просто свое решение задачи?
Асинхронные запросы без ожидания ответа — это и есть большая проблема. Здесь важно, чтобы каждый запрос обрабатывался последовательно, так как, к примеру, нельзя перейти к шагу импорта записей во временную таблицу, пока эта таблица не очищена.
А вы как обошлись без передачи логов через файлы между работающим скриптом импорта и Javascript-формой?
Все просто: идет запрос на сервер, и с сервера информация поступает в ответе через стандартное return $this->success($msg, $object);
Асинхронные запросы без ожидания ответа — это и есть большая проблема. Здесь важно, чтобы каждый запрос обрабатывался последовательно, так как, к примеру, нельзя перейти к шагу импорта записей во временную таблицу, пока эта таблица не очищена.
В базовой версии это компенсировалось тем, что весь импорт выполнялся в рамках одного процессора, а в нем действия могут выполняться только последовательно. А веб-форма просто проверяла регистр на наличие новых сообщений. Таким образом логика работы процессора не могла нарушиться асинхронными запросами.
Все просто: идет запрос на сервер, и с сервера информация поступает в ответе через стандартное return $this->success($msg, $object);
Мне непонятен следующий момент. Вы выполняете импорт в процессоре, а во время импорта процессор не может ответить на запрос формы, так как он уже начал свою работу и нужен какой-то промежуточный обмен данными между работающим процессором и формой. Он должен сохранять сообщения о ходе операции, чтобы форма запросом к промежуточному скрипту могла отобразить все сообщения работающего процессора. Так работает стандартная консоль + процессор. Сам процессор кладет сообщения в регистр и форма их потом забирает. Как вы смогли избавиться от промежуточного стека сообщений?
В базовой версии это компенсировалось тем, что весь импорт выполнялся в рамках одного процессора, а в нем действия могут выполняться только последовательно. А веб-форма просто проверяла регистр на наличие новых сообщений. Таким образом логика работы процессора не могла нарушиться асинхронными запросами.
А вы условие в топике читали:
при чем так, чтобы уложиться в 30 секунд и 64 Mb памяти
Уверены, что 30 секунд нам будет достаточно, чтобы прогрузить 13 000 товаров? Эту проблему данный компонент и решает — он в цикле шлет кучу запросов, на каждый из которых может уходить до 30-ти секунд. Таким образом импортер хоть сутки может крутиться и прогрузить хоть миллион товаров.
Вы выполняете импорт в процессоре, а во время импорта процессор не может ответить на запрос формы, так как он уже начал свою работу и нужен какой-то промежуточный обмен данными между работающим процессором и формой.
Вы в целом не уловили смысла этого решения. Смысл в том, что вся процедура разбивается на кучу шагов. То есть запрос отрабатывает запрос, возвращает ответ, консоль кушает ответ и опять шлет запрос, и т.д. и т.п., пока процессор не вернет «COMPLITED».
Не было возможности посмотреть видео со звуком, а в описании к видео недостаточно информации. Там вы все хорошо объясняете. А по видео слишком уж похоже на стандартный импорт и разницы в подходе не видно. Прошу меня простить за поспешность.
А почему именно 30, а не 40 или 20 сек.? У меня просто была проблема с компонентом от Andchir, в общем при импорте на 30-й секунде была проблема…
Не я это придумал. Это стандартный порог в настройках нгинкса, апача и т.п. В настройках можно его изменить, если VPS или типа того.
Добрый день, Николай. Делаю небольшой магазин на ShopModX. Столкнулся с проблемой импорта товаров из выгрузки на Яндекс.Маркет. Можно ли где-то посмотреть пример как правильно импортировать в ShopModX товары? Сам изучение ModX начал недавно. Хотелось самому разобраться, да вот пока не очень получается с импортом…
Можно чуть подробней про этот «импорт товаров из выгрузки на Яндекс.Маркет»? Экспорт в Я.Маркет не рассчитан на то, чтобы его импортировали потом на сайте. Это чисто выгрузка на яндекс.
Мой клиент является партнером одной фирмы, у которой есть сайт, с этого сайта мне предоставляют выгрузку в Яндекс.Маркет, чтобы я разместил ее на сайте клиента.
Ну, если там выгрузка подробная, то ее можно использовать. Используйте SimpleXML, загружайте их файл и создавайте/обновляйте ресурсы на своем сайте. Если опыта нет и не справитесь, можем написать импортер. Цена 3000 рублей.
Добрый день! А можно ли где-то скачать данный импортер?
Добрый день! Пока нет. Это вещь чисто индивидуальная, настраиваемая на отдельных проектах. Но не исключено появление какой-то более массовой вариации.
Добрый день Николай!
Но не исключено появление какой-то более массовой вариации.
По прежнему нельзя скачать данный импортер?
Пока что да. Но, думаю скоро появится:)
ладно, подождем…

Добавить комментарий