@bysobi

Многопоточность/многозадачность/очереди в php?

Есть пользователи.
У пользователей на сайте есть избранные товары, которые они могут загружать на сторонние сайты(настроена связь через api).
Загрузка на сторонние сайты имеет ограничение по количеству загрузок продуктов(максимум 500 продуктов за раз). Ограничение обнуляется каждые 5 минут.
Ограничение действует на каждого пользователя отдельно.

Раньше, когда пользователей было мало, я создавал очередь: пользователи нажимали кнопку "загрузить товары", все товары попадали в таблицу и крон каждые 5 минут выбирал юзера, выбирал его товары и загружал товары на сайт.

НО, крон загружает продукты юзеров по очереди. То есть, выбирал сначала одного юзера, загружает ему товары, пока они не загрузятся, других он не запускал. Работало через foreach.

Вопрос:
Как запускать скрипт для каждого юзера в очереди. Или хотя бы по 10 человек одновременно(чтобы сервер не положить)? Использовать очередь? Многопоточность? Не имел опыта работы с ними. Подскажите, как решить проблему.

Так же имеется проблема/вопрос, так как стоит ограничение в 500 выгрузок товаров за один раз. И это нужно учитывать, если сделать многопоточность. То есть выгрузка будет перерываться и ее нужно будет продолжать через 5 минут(как только ограничения обнулятся).
  • Вопрос задан
  • 179 просмотров
Пригласить эксперта
Ответы на вопрос 2
Запускайте скрипт для каждого пользователя. А если какому-то пользователю нужно выгрузить больше 500 товаров, то, используя общее хранилище для каждой запущенной копии скрипта, сохраняйте данные для выгрузки остатка товаров. При этом, учитывая, что выгрузка может занять больше времени, чем планировалось, надо также сохранить и статус выполнения (то есть, если скрипт А ещё делает выгрузку, но уже прошло 5 минут или больше, то скрипт Б об этом должен узнать и не выполняться). А ещё, учитывая и то, что каждый пользователь делает запрос в разное время, то интервал в 5 минут будет смещаться
Ответ написан
Комментировать
@CyberTeam
Имхо, тут никакая многопоточность не нужна (так сложнее будет ограничеть общее число запросов на экспорт)
Я вижу тут 2 пути решения проблемы:
1. сразу отправлять задачи на сервер очередей и по необходимости ограничивать для конкретного пользователя кол-во экспортированных продуктов, а на излишки создавать новую задачу(задачи) с дилеем 5 минут.
2. имхо, вариант получше, создать таблицу в SQL БД, либо ключ в Redis, с очередью экспорта, куда можно помещать заказы пользователя и удалять обработанные заказы. Проверять данную очередь и ограничения на конкретного пользователя можно по крону раз в минуту, например. Притом проверять, желательно, сразу же при выборке задач, которые необходимо выполнить. Но тогда будет задержка в экспорте максимум в эту же минуту.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы