Почему curl_errno () возвращает 0, когда были ошибки в сочетании с curl_multi_init ()? - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть список доменов, которые я хочу проверить, активны они или нет. Я могу проверить каждый из них по отдельности, но мне трудно заставить пакет работать.

  $c200= array();
  $c301= array();
  $c302= array();

$urls=array();
  foreach (new SplFileObject("oList.txt") as $line) {
    $urls[]=$line;

}
//print_r($urls);

$mh = curl_multi_init();
foreach ($urls as $key => $value) {
  $ch[$key] =curl_init($value);
  curl_setopt($ch[$key], CURLOPT_HEADER, true);
  curl_setopt($ch[$key], CURLOPT_TIMEOUT, 10);
  curl_multi_add_handle($mh, $ch[$key]);

}

do{
  curl_multi_exec($mh, $running);
  curl_multi_select($mh);
}while ($running > 0);

foreach (array_keys($ch) as $key) {

  echo curl_getinfo($ch[$key], CURLINFO_HTTP_CODE);
  echo "\n";

  curl_multi_remove_handle($mh, $ch[$key]);
}
curl_multi_close($mh)

Я написал приведенный выше код, но он выдает мне нули в качестве вывода. любая помощь будет оценена.

1 Ответ

0 голосов
/ 28 февраля 2020

curl_errno() не возвращает результирующий код, если он используется внутри curl_multi.

Кажется, что он недокументирован, но если ошибка возникает внутри curl_multi(), то resources не приведет к код ошибки до curl_multi_info_read() вызывается. Существует ссылка на ошибку / запрос документации: https://bugs.php.net/bug.php?id=79318&thanks=4

Оригинальный ответ

Обычно, когда я вмешиваюсь в 0 в качестве кода ответа, у меня возникает локальная проблема (DNS, сеть, SSL, URL ..).

Чтобы копать дальше, вы можете проверить, была ли в curl ошибка при выполнении. Это можно проверить с помощью curl_errno () , который возвращает номер ошибки скручивания, и curl_error () , который вернет описательную строку ошибки.

Код ошибки и ошибка -Message, возможно, будет одним из тех, которые вы можете найти здесь: https://curl.haxx.se/libcurl/c/libcurl-errors.html

EDIT # 2

Если вы работаете с curl_multi, вам нужно позвонить curl_multi_info_read() один раз, чтобы получить результирующие коды. Ниже приведен пример того, как вы можете получить соответствующую запись результата.

// your code...

do {
    curl_multi_exec($mh, $running);
    curl_multi_select($mh);
} while ($running > 0);

while ($result = curl_multi_info_read($mh)) {
    if ($result['result'] == CURLM_OK) {
        echo 'Success: ' . curl_getinfo($result['handle'], CURLINFO_HTTP_CODE) . "\n";
    } else {
        echo 'Error: ' . curl_strerror($result['result']) . "\n";
    }
}

Реальный тест теперь приведет к следующему:

$ php test.php 
Error: Couldn't resolve host name
Success: 200
Success: 200

РЕДАКТИРОВАТЬ # 3

Кроме того, кажется, что вызов curl_multi_info_read($mh) тоже помогает, и внутренне заполняет информацию в ваших существующих дескрипторах / ресурсах.

На мой взгляд, это немного вводит в заблуждение. Я создам отчет об ошибке / документации для php, так как ничего не могу найти по этому поводу. Я просто наткнулся на то, как я проверил, как жадность сделала его низкоуровневую реализацию.

// your code...

do {
    curl_multi_exec($mh, $running);
    curl_multi_select($mh);
} while ($running > 0);

while ($result = curl_multi_info_read($mh)) {}

foreach($ch as $handle) {
    echo "Handle: " . curl_errno($handle) . PHP_EOL;
}
...