Как получить результат выполнения curl_multi_exec по отдельности?
Сейчас код отдает один результат, как получить отдельно данные по каждому url?
// create both cURL resources
$ch1 = curl_init();
$ch2 = curl_init();
// set URL and other appropriate options
curl_setopt($ch1, CURLOPT_URL, "https://site1.ru");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "https://site2.ru");
curl_setopt($ch2, CURLOPT_HEADER, 0);
//create the multiple cURL handle
$mh = curl_multi_init();
//add the two handles
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);
//выполните мульти-дескриптор
do {
$status = curl_multi_exec($mh, $active);
if ($active) {
// Подождите некоторое время для большей активности
curl_multi_select($mh);
}
} while ($active && $status == CURLM_OK);
//close the handles
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
Спасибо!
Ответы (1 шт):
Автор решения: stylok
→ Ссылка
Во-первых, дабы не плодить curl_init() и curl_setopt() (как у вас вначале) такие вещи обычно оформляют единым блоком и добавляют их в виде перебора массива.
А в остальном всё просто...
// блок ссылок
$urls = [
"https://site1.ru/api/3/",
"https://site2.ru/api/2/",
"https://site3.ru/api/1/",
];
$mh = curl_multi_init();
$allResponse = [];
// добавление
foreach($urls as $k => $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_multi_add_handle($mh, $ch);
$allResponse[$k] = $ch;
}
$running = null;
do {
curl_multi_exec($mh, $running);
} while($running > 0);
// перебираем весь набор ответов
foreach($allResponse as $id => $ch) {
// получаем один из ответов
$response = curl_multi_getcontent($ch);
curl_multi_remove_handle($mh, $ch);
// проверяем его на корректность по какому-то подходящему вам условию.
if($response !== 'null') {
$response = (json_decode($response));
print_r($response->title."\n");
}
}
curl_multi_close($mh);