PHP Multi curl или многопоточность - PullRequest
3 голосов
/ 21 октября 2011

Я создаю задание cron, которое выполняет следующее:
1. Получение записей из БД
2. Для каждой записи запускается запрос скручивания к 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/
, чтобы не дождаться завершения всех запросов, прежде чем я начну обрабатывать ответы.

Спасибо!

Ответы [ 2 ]

1 голос
/ 27 октября 2011

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

1 голос
/ 21 октября 2011

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

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

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

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

...