Относительно интеграции 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 по curl_multi_exec()
и связанным функциям.
Короче говоря, идея в том, что вы все равно инициализируете свои ручки завитка таким же образом. (В документации PHP это явно не упоминается, но простой дескриптор скручивания иногда называют «простым» дескриптором - чтобы отличить его от «мульти» дескриптора.)
$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-адреса из текстового файла (что, я подозреваю, вы уже делаете ).