PHP Multi curl или многопоточность

#php #multithreading #curl #curl-multi

#php #многопоточность #curl #curl-multi

Вопрос:

Я создаю задание cron, которое выполняет следующее:
1. Получает записи из базы
данных 2. Для каждой записи запускает запрос curl к API. (некоторые запросы выполняются быстро, а некоторые загружают большие изображения или видео).
3. Если запрос не прошел успешно, создайте новый запрос с немного другими параметрами (все еще на основе записи) и отправьте его снова. Это может произойти несколько раз.
4. При успешном запросе выполните некоторые операции выбора / вставки базы данных (на основе исходной записи, которая вызвала отправку этого запроса).

Отправка запросов должна происходить параллельно, так как некоторые из них занимают минуты (большие загрузки), а некоторые очень быстрые.

Что было бы наиболее подходящим для этого — иметь главный скрипт, который получает записи из базы данных и создает процесс для каждой записи для обработки вызова API и анализа ответа? Или использование curl_multi для одновременной отправки нескольких запросов из одного и того же скрипта и анализа каждого из них по мере его возврата?

При использовании нескольких процессов, каков наилучший способ сделать это — PCNTRL, popen и т.д.?
При использовании curl_multi как я узнаю, какая запись БД соответствует какому возвращаемому запросу?

РЕДАКТИРОВАТЬ: при использовании curl multi я бы, вероятно, использовал эту технику: http://www.onlineaspect.com/2009/01/26/how-to-use-curl_multi-without-blocking /
чтобы он не ждал завершения всех запросов, прежде чем я начну обрабатывать ответы.

Спасибо!

Ответ №1:

У меня была аналогичная проблема при обработке большого набора данных.

Самым простым ответом для меня было создать 4 отдельных скрипта, каждый из которых был написан для использования определенной четвертой части задействованных столбцов БД, и в моем случае выполнять обработку или в вашем случае запросы curl. Это предотвратило бы блокировку других из-за большого запроса на одном из процессов.

В отличие от этого, один скрипт, использующий curl_multi, по-прежнему будет блокировать большой запрос, он просто позволит вам поставить в очередь несколько одновременно.

Оптимально я бы вместо этого написал это на языке с встроенной поддержкой многопоточности, чтобы вы могли выполнять одновременные действия, не прибегая к взломам, но это, по понятным причинам, не всегда вариант.

Ответ №2:

В конце концов я пошел с многопроцессорной обработкой с использованием PCNTRL (с ограничением количества одновременных процессов). Мне показалось, что curl_multi не будет масштабироваться для тысяч запросов.