Что касается интеграции curl
...
Будет ли curl ждать окончания каждого выполнения?
Это зависит от того, как вы используете библиотеку curl. Вы пометили вопрос с помощью «php» и «php-curl» - так что, похоже, вы обращаетесь к процедурам curl из PHP.
Если вы используете интерфейс curl easy
примерно следующим образом:
- инициализировать простой дескриптор с помощью
$req = curl_init()
- установить URL и другие параметры с помощью
curl_setopt()
- выполнить (одиночный) запрос с
curl_exec($req)
- закрыть или сбросить запрос с помощью
curl_close($req)
или curl_reset($req)
тогда, естественно, вам придется ждать завершения каждого запроса, прежде чем начинать следующий.
Альтернативой является использование интерфейса multi
(см. Ниже), который позволяет нескольким запросам работать одновременно.
считается ли это плохой практикой?
Если вы отправляете такое большое количество сетевых запросов - а каждый запрос потенциально занимает такое много времени - я думаю, что это, безусловно, далеко от идеала. Было бы предпочтительнее использовать интерфейс curl multi, если это вообще возможно.
multi
интерфейс
Как поясняется в документации по curl, мультиинтерфейс (в отличие от ' легкий интерфейс)
Включите [s] несколько одновременных передач в одном потоке, не усложняя это для приложения ...
Мой PHP очень слаб, поэтому - вместо того, чтобы публиковать полный пример сам - я вместо этого отсылаю вас к документации PHP на _ 10_ и связанные функции.
Вкратце, идея состоит в том, что вы по-прежнему инициализируете свои ручки curl таким же образом. (В документации PHP это явно не упоминается, но простой дескриптор curl иногда называют «простым» дескриптором - чтобы отличить его от «мульти» дескриптора.)
$req1 = curl_init();
$req2 = curl_init();
// Set URL and other options using `curl_setopt(...)`
(Я опускаю здесь все проверки ошибок для краткости.) Однако вместо вызова curl_exec(...)
вы вместо этого создаете экземпляр multi
,
$mh = curl_multi_init();
добавьте easy
дескрипторы к вашему вновь созданному экземпляру multi
,
curl_multi_add_handle($mh, $req1);
curl_multi_add_handle($mh, $req2);
а затем (вместо вызова curl_exec()
для одного easy
дескриптора) периодически вызывать curl_multi_exec(...)
в цикле:
curl_multi_exec($mh, $running);
Переменная $running
будет обновлена, чтобы указать, есть ли еще выполняющиеся запросы, поэтому - как только $ running станет ложным - вы можете выйти из цикла и завершить его.
Когда закончите, не забудьте прибраться.
curl_multi_remove_handle($mh, $req1);
curl_multi_remove_handle($mh, $req2);
curl_multi_cleanup($mh);
Оптимизация под большое количество запросов
Вместо использования отдельных переменных для каждого запроса - как в $req1
, $req2
и т. Д. - вы можете использовать массив запросов - возможно, загружая соответствующие URL-адреса из текстового файла (что, как я подозреваю, вы уже делаете).
person
David Collins
schedule
02.07.2018