Fi1osof 14 июля 2013 0 19
Я недавно выкладывал на ютуб ролик (смотрим под катом), в котором демонстрировал этот импортер, и вот кратко здесь про него напишу.

Для начала задача: выполнить импорт 13 000 товаров (и не просто импорт, а еще и с проверкой существующих товаров, разделов и т.п., и обновлением остатков и цен, если товар уже есть, а еще и отметкой «нет в наличии» тех товаров, которые уже есть в каталоге, но которых нет в файле импорта), при чем так, чтобы уложиться в 30 секунд и 64 Mb памяти.

В общем, я сразу решил, что в такие рамки не уложиться, и что надо написать такой модуль, который работал бы в цикле (пока задача не будет выполнена), при этом, чтобы вся логика полностью рулилась на стороне сервера. В общем, вот это как раз и есть такое решение (чуть подробней в ролике). Отмечу только, что это дело очень похоже на стандартный компонент MODx.Console, но это не он. Нативный компонент я попробовал, но отмел из-за того, что он только асинхронные запросы отправляет, не дожидаясь ответа. В общем, морду писал сам.

19 комментариев
Q
Qwarble 15 июля 2013г в 12:22 #
Добрый день, Николай. А чем именно не понравился стандартный компонент MODx.Console? Я делал на нем импорт 300 000 позиций и нареканий с ним не было. Конечно там может перекосить регистры, на которых он, собственно, и работает, но в целом компонент мне показался довольно стабильным.
Fi1osof1
Fi1osof 15 июля 2013г в 14:06 #
Добрый день.
А чем именно не понравился стандартный компонент MODx.Console?
1. Тем, что он запросы шлет асинхроннонные, и не дожидаясь ответа, шлет новый запрос. (возможность переключить провайдер в синхронный режим я не нашел. Если вы знаете как, поделитесь, полезно будет).
2. Слишком хитрая система записи логов в файлы и чтения ответов из них. По-моему избыточная сложность.

Я ранее уже делал импортер с использованием стандартной консоли MODX-а ( www.youtube.com/watch?feature=player_detailpage&v=fpkfFbInV88#t=44s ), и хочу сказать, что второй вариант мне показался более простым и гибким.
Q
Qwarble 15 июля 2013г в 18:08 #
То есть реальных проблем со стандартной консолью не было, просто свое решение задачи?
(возможность переключить провайдер в синхронный режим я не нашел. Если вы знаете как, поделитесь, полезно будет).
Нет, я ничего подобного в коде не видел, когда мне нужен был этот компонент. Чтобы все это дело заставить дожидаться ответа действительно придется переписывать консоль.
А вы как обошлись без передачи логов через файлы между работающим скриптом импорта и Javascript-формой?
Fi1osof1
Fi1osof 15 июля 2013г в 18:17 #
То есть реальных проблем со стандартной консолью не было, просто свое решение задачи?
Асинхронные запросы без ожидания ответа — это и есть большая проблема. Здесь важно, чтобы каждый запрос обрабатывался последовательно, так как, к примеру, нельзя перейти к шагу импорта записей во временную таблицу, пока эта таблица не очищена.

А вы как обошлись без передачи логов через файлы между работающим скриптом импорта и Javascript-формой?
Все просто: идет запрос на сервер, и с сервера информация поступает в ответе через стандартное return $this->success($msg, $object);
Q
Qwarble 15 июля 2013г в 18:57 #
Асинхронные запросы без ожидания ответа — это и есть большая проблема. Здесь важно, чтобы каждый запрос обрабатывался последовательно, так как, к примеру, нельзя перейти к шагу импорта записей во временную таблицу, пока эта таблица не очищена.
В базовой версии это компенсировалось тем, что весь импорт выполнялся в рамках одного процессора, а в нем действия могут выполняться только последовательно. А веб-форма просто проверяла регистр на наличие новых сообщений. Таким образом логика работы процессора не могла нарушиться асинхронными запросами.
Все просто: идет запрос на сервер, и с сервера информация поступает в ответе через стандартное return $this->success($msg, $object);
Мне непонятен следующий момент. Вы выполняете импорт в процессоре, а во время импорта процессор не может ответить на запрос формы, так как он уже начал свою работу и нужен какой-то промежуточный обмен данными между работающим процессором и формой. Он должен сохранять сообщения о ходе операции, чтобы форма запросом к промежуточному скрипту могла отобразить все сообщения работающего процессора. Так работает стандартная консоль + процессор. Сам процессор кладет сообщения в регистр и форма их потом забирает. Как вы смогли избавиться от промежуточного стека сообщений?
Fi1osof1
Fi1osof 15 июля 2013г в 19:04 #
В базовой версии это компенсировалось тем, что весь импорт выполнялся в рамках одного процессора, а в нем действия могут выполняться только последовательно. А веб-форма просто проверяла регистр на наличие новых сообщений. Таким образом логика работы процессора не могла нарушиться асинхронными запросами.
А вы условие в топике читали:
при чем так, чтобы уложиться в 30 секунд и 64 Mb памяти
Уверены, что 30 секунд нам будет достаточно, чтобы прогрузить 13 000 товаров? Эту проблему данный компонент и решает — он в цикле шлет кучу запросов, на каждый из которых может уходить до 30-ти секунд. Таким образом импортер хоть сутки может крутиться и прогрузить хоть миллион товаров.

Вы выполняете импорт в процессоре, а во время импорта процессор не может ответить на запрос формы, так как он уже начал свою работу и нужен какой-то промежуточный обмен данными между работающим процессором и формой.
Вы в целом не уловили смысла этого решения. Смысл в том, что вся процедура разбивается на кучу шагов. То есть запрос отрабатывает запрос, возвращает ответ, консоль кушает ответ и опять шлет запрос, и т.д. и т.п., пока процессор не вернет «COMPLITED».
Q
Qwarble 16 июля 2013г в 11:24 #
Не было возможности посмотреть видео со звуком, а в описании к видео недостаточно информации. Там вы все хорошо объясняете. А по видео слишком уж похоже на стандартный импорт и разницы в подходе не видно.
Прошу меня простить за поспешность.
Fi1osof1
Fi1osof 16 июля 2013г в 11:40 #
Ничего страшного.
M
MisterN 09 сентября 2013г в 22:10 #
А почему именно 30, а не 40 или 20 сек.? У меня просто была проблема с компонентом от Andchir, в общем при импорте на 30-й секунде была проблема…
Fi1osof1
Fi1osof 10 сентября 2013г в 15:38 #
Не я это придумал. Это стандартный порог в настройках нгинкса, апача и т.п.
В настройках можно его изменить, если VPS или типа того.
a
alien 20 октября 2013г в 16:57 #
Добрый день, Николай. Делаю небольшой магазин на ShopModX. Столкнулся с проблемой импорта товаров из выгрузки на Яндекс.Маркет. Можно ли где-то посмотреть пример как правильно импортировать в ShopModX товары? Сам изучение ModX начал недавно. Хотелось самому разобраться, да вот пока не очень получается с импортом…
Fi1osof1
Fi1osof 21 октября 2013г в 03:36 #
Можно чуть подробней про этот «импорт товаров из выгрузки на Яндекс.Маркет»? Экспорт в Я.Маркет не рассчитан на то, чтобы его импортировали потом на сайте. Это чисто выгрузка на яндекс.
a
alien 21 октября 2013г в 17:07 #
Мой клиент является партнером одной фирмы, у которой есть сайт, с этого сайта мне предоставляют выгрузку в Яндекс.Маркет, чтобы я разместил ее на сайте клиента.
Fi1osof1
Fi1osof 21 октября 2013г в 19:32 #
Ну, если там выгрузка подробная, то ее можно использовать.
Используйте SimpleXML, загружайте их файл и создавайте/обновляйте ресурсы на своем сайте. Если опыта нет и не справитесь, можем написать импортер. Цена 3000 рублей.
s
shade2004 03 апреля 2014г в 16:25 #
Добрый день!
А можно ли где-то скачать данный импортер?
Fi1osof1
Fi1osof 03 апреля 2014г в 16:55 #
Добрый день!
Пока нет. Это вещь чисто индивидуальная, настраиваемая на отдельных проектах. Но не исключено появление какой-то более массовой вариации.
v
vshatl 07 февраля 2015г в 11:59 #
Добрый день Николай!
Но не исключено появление какой-то более массовой вариации.
По прежнему нельзя скачать данный импортер?
Fi1osof1
Fi1osof 07 февраля 2015г в 15:39 #
Пока что да. Но, думаю скоро появится:)
v
vshatl 07 февраля 2015г в 16:45 #
ладно, подождем…
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.