Как получить результат выполнения 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);
→ Ссылка