С помощью curl_getinfo() вы можете получить коды ответа на запрос: https://www.php.net/manual/en/function. curl-getinfo.php

$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE));

Есть функция curl_multi_info_read(), но я думаю, что она делает не совсем то же самое: https://www.php.net/manual/ ru/function.curl-multi-info-read.php

Contents of the returned array
Key:    Value:
msg The CURLMSG_DONE constant. Other return values are currently not available.
result  One of the CURLE_* constants. If everything is OK, the CURLE_OK will be the result.
handle  Resource of type curl indicates the handle which it concerns.

Пример кода:

var_dump(curl_multi_info_read($mh));

Дает такой вывод:

array(3) {
  ["msg"]=>
  int(1)
  ["result"]=>
  int(0)
  ["handle"]=>
  resource(5) of type (curl)
}

Вместо того, чтобы указывать код ответа HTTP. Есть ли способ получить код ответа HTTP из этого возвращаемого массива? Или, может быть, какой-то другой способ получить коды ответов в curl_multi()?

1
Tristan 26 Янв 2022 в 12:57

1 ответ

Лучший ответ

ВЫ можете использовать curl_multi_select(), как показано в первом примере в curl_multi_info_read(). Затем вы можете использовать $info['handle'] для получения информации обо всех запросах.

$urls  = [
    'http://www.cnn.com/',
    'http://www.bbc.co.uk/',
    'http://www.yahoo.com/'
];
$codes = [];

$mh = curl_multi_init();
foreach ($urls as $i => $url) {
    $conn[$i] = curl_init($url);
    curl_setopt($conn[$i], CURLOPT_RETURNTRANSFER, 1);
    curl_multi_add_handle($mh, $conn[$i]);
}

do {
    $status = curl_multi_exec($mh, $active);
    if ($active) {
        curl_multi_select($mh);
    }
    while (false !== ($info = curl_multi_info_read($mh))) {
        //
        // here, we can get informations about current handle.
        //
        $url = curl_getinfo($info['handle'],  CURLINFO_REDIRECT_URL);
        $http_code = curl_getinfo($info['handle'], CURLINFO_HTTP_CODE);

        // Store in an array for future use :
        $codes[$url] = $http_code;
    }
} while ($active && $status == CURLM_OK);

foreach ($urls as $i => $url) {
    // $res[$i] = curl_multi_getcontent($conn[$i]);
    curl_close($conn[$i]);
}

// display results
print_r($codes);

Выход :

Array
(
    [https://www.cnn.com/] => 301
    [https://www.bbc.co.uk/] => 302
    [https://www.yahoo.com/] => 301
)
1
Syscall 26 Янв 2022 в 13:14