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 и curl_error(), который вернет описательную строку ошибки.
Код ошибки и сообщение об ошибке, возможно, будут одними из тех, которые вы можете найти здесь: https://curl.haxx.se/libcurl/c/libcurl-errors.html
РЕДАКТИРОВАНИЕ №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;
}
person
Christoph Kluge
schedule
28.02.2020