Программное обновление ресурсов (7000+)

Добрый вечер, коллеги, такая ситуация.
Имеется интернет-магазин. Каждые полчаса происходит импорт остатков товаров на сайте (из файла csv).

Ищу ресурсы по TV-полю артикул, и уже дальше из csv Файла обновляю цену и остатки в магазине. На данный момент делаю это с помощью API modx через
$modx->getCollection('modResource')
, знаю что еще ресурсы можно обновлять через процессоры. Хотелось спросить, какой метод производительнее(меньше жрет ресурсы, быстрее срабатывает): через ручное обновление ($modx->getCollection('modResource') или же через процессоры?

На данный момент скрипт порой может работать до 10 минут, что меня очень сильно напрягает по потреблению ресурсов.
Alexander Serezhin
30 ноября 2015, 15:48
modx.pro
1 019
0

Комментарии: 8

Stan Ezersky
30 ноября 2015, 22:57
0
Ищу ресурсы по TV-полю артикул
У вас на чём магазин?

В miniShop2 есть скрипт для автоматизации импорта, подробнее здесь
    Alexander Serezhin
    30 ноября 2015, 22:58
    0
    shopkeeper
      Stan Ezersky
      30 ноября 2015, 23:00
      0
      Для Shopkeeper'а было же платное дополнение для импорта товаров, не пользовались?
        Alexander Serezhin
        30 ноября 2015, 23:02
        0
        Я ж не прошу помощи в поиска импорта, а спросил конкретно про производительность api каким способом лучше, быстрее, обновлять/создавать ресурсы…
    Воеводский Михаил
    30 ноября 2015, 23:00
    0
    В такой задаче, хоть и не самый правильный способ, я бы смотрел в сторону обновления на чистом SQL, если нет необходимости отработки плагинов и прочего при изменении товаров. А такой необходимости нет, учитывая допустимость работы без процессоров.

    Что касается самих процессоров, с ними быстрее не получится. Они, помимо getObject() и save() выполняют еще огромное количество функций и проверок.

    У вас товары сохраняются все и всегда? Или есть проверка на изменившиеся поля?
      Alexander Serezhin
      30 ноября 2015, 23:05
      0
      При импорте у меня только как я писал выше обновляется цена и остатки в 3 tv-полях, либо создаются новые ресурсы, если не находятся по артикулам из существующих. Спасибо, посмотрю в сторону чистого sql, либо посмотрю существующий код и гляну где можно оптимизировать работу :)

      Спасибо!
        Воеводский Михаил
        30 ноября 2015, 23:08
        +2
        1) Использовать getIterator
        2) Перед сохранением установкой новых значений и сохранением в базу проверять, есть ли изменения. Если не изменилось, ничего не делать.

        Это самая очевидная оптимизация. Следующий шаг — начальная выборка значений в виде массивов данных, без getCollection/getIterator. Сравнить все на уровне массивов, затем быстро пройти только по изменившимся товарам.

        И, кстати, рекомендую именно проверку на уровне массивов сделать с формированием нового массива, в котором будут изменившиеся значения. На мой взгляд, быстрее этого варианта только чистый SQL. Могу, конечно, ошибаться.
          Alexander Serezhin
          30 ноября 2015, 23:20
          0
          Спасибо, сейчас буду пробовать.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      8