У меня есть сайт на битрикс, и есть стороннее API, с которого я получаю данные. Данные приходят таким образом: можно получить либо сразу все данные (юзеры, категории, услуги), либо получить сначала всех юзеров, записать их в инфоблок, а потом используя уникальный id юзера сделать ещё раз запрос и получить конкретно для каждого юзера категории и услуги, которые относятся к нему и записать их уже со связью. Мне необходимо реализовать второй вариант получения данных и записать услуги и категории вместе со связью с юзерами. Но я столкнулся с проблемой реализации получения данных и их записи. Мой алгоритм выглядит так: есть N пользователей, которых я получаю по API, записываю их в инфоблок, в процессе записывая их уникальный id в массив, и получаю массив уникальных id пользователей, дальше делаю foreach, в котором прохожусь по этим id, каждый добавляю в массив параметров для запроса и делаю запрос.
Логика была такая: я делаю N запросов с каждым отдельным id (api не поддерживает работу с массивом запросов), каждый полученный результат обрабатываю и записываю в БД. Но мой сайт падает с таким количеством запросов, а других вариантов я придумать не могу. Может кто-нибудь посоветовать, как можно реализовать такой алгоритм получения и записи данных?
Типа того.
Пишите агент, в нем выбираете, например, 10 ИД.
Обрабатываете. Запоминаете последний ИД.
Из функции агента создаете следующий агент в котором берете уже следующие ИД.
И так пока все не обработаете. Затем после того, как пройдёт новый импорт пользователей, запускаете агент снова и он снова проходит все пошагово.
За один раз вы конечно большой объем не обработаете. Надо дробить.
Для решения проблемы с обработкой большого количества {{anything}} давно придуманы очереди. На первом этапе получаем перечень объектов для обработки, добавляем job'ы (объекты) в очередь, а дальше обрабатываем очередь при помощи worker'ов. Дополнительным плюсом такого подхода будет возможность запустить обработку job'ов (объектов) в несколько параллельных потоков, что даст выигрыш во времени обработки.
Скрипт 1
Проверили базу с необработанными айдишниками, если пусто: Получили айдишники -> записали их в базу.
Скрипт 2
В идеале нужен отдельный скрипт который по кронтабу например каждую минуту постоянно запускается, базы берёт айдишники по одному, обрабатывает их и удаляет.
Причём нужно делать через транзакции.
Скрипт 1 тоже можно по расписанию запускать если необходимо.
Если задача не постоянная, а периодическая - можно обойтись без кронтаба, обновляя страницу ручками или накидать js скрипт в этой странице.