curl_getinfo

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

curl_getinfoПолучает информацию о конкретной передаче

Описание

curl_getinfo(CurlHandle $handle, ?int $option = null): mixed

Получает информацию о последней передаче.

Список параметров

handle

Дескриптор cURL, полученный из curl_init().

option

Константа из списка:

Опция Описание
CURLINFO_CAINFO Путь к встроенному сертификату удостоверяющего центра по умолчанию
CURLINFO_CAPATH Строка пути к встроенному сертификату удостоверяющего центра по умолчанию
CURLINFO_EFFECTIVE_URL Последний эффективный URL
CURLINFO_HTTP_CODE Последний код ответа. Начиная с cURL 7.10.8 это устаревший псевдоним опции CURLINFO_RESPONSE_CODE
CURLINFO_FILETIME Время получения документа по часам удалённого сервера, если параметр CURLOPT_FILETIME включён для дескриптора cURL; если возвращается значение -1, то время получения документа неизвестно
CURLINFO_TOTAL_TIME Общее время транзакции в секундах для последней передачи
CURLINFO_NAMELOOKUP_TIME Время в секундах, затраченное на разрешение имени
CURLINFO_CONNECT_TIME Время в секундах, затраченное на установку соединения
CURLINFO_PRETRANSFER_TIME Время в секундах от запуска до момента начала передачи файла
CURLINFO_STARTTRANSFER_TIME Время в секундах от запуска передачи до получения первого байта
CURLINFO_REDIRECT_COUNT Число перенаправлений, если параметр CURLOPT_FOLLOWLOCATION включён для дескриптора cURL
CURLINFO_REDIRECT_TIME Общее время в секундах, которое потребовалось для всех шагов перенаправления до запуска последней транзакции, если параметр CURLOPT_FOLLOWLOCATION включён для дескриптора cURL
CURLINFO_REDIRECT_URL Если параметр дескриптора CURLOPT_FOLLOWLOCATION отключён: URL-адрес перенаправления, найденный в последней транзакции, который в следующий раз надо запросить вручную. Если параметр CURLOPT_FOLLOWLOCATION включён: пустое значение. Тогда URL-адрес перенаправления доступен в опции CURLINFO_EFFECTIVE_URL
CURLINFO_PRIMARY_IP IP-адрес последнего соединения
CURLINFO_PRIMARY_PORT Порт назначения последнего соединения
CURLINFO_LOCAL_IP Локальный (исходящий) IP-адрес последнего соединения
CURLINFO_LOCAL_PORT Локальный (исходящий) порт последнего соединения
CURLINFO_SIZE_UPLOAD Общее количество переданных байтов
CURLINFO_SIZE_DOWNLOAD Общее количество полученных байтов
CURLINFO_SPEED_DOWNLOAD Средняя скорость получения данных
CURLINFO_SPEED_UPLOAD Средняя скорость передачи данных
CURLINFO_HEADER_SIZE Суммарный размер полученных заголовков
CURLINFO_HEADER_OUT Отправленная строка запроса. Чтобы этот параметр работал, нужно добавить опцию CURLINFO_HEADER_OUT в дескриптор через вызов функции curl_setopt()
CURLINFO_REFERER Заголовок реферера
CURLINFO_REQUEST_SIZE Суммарный размер отправленных запросов, работает пока только для HTTP-запросов
CURLINFO_RETRY_AFTER Информация из заголовка Retry-After: или ноль, если допустимого заголовка не было
CURLINFO_SSL_VERIFYRESULT Результат проверки SSL-сертификации, запрошенный с параметром CURLOPT_SSL_VERIFYPEER
CURLINFO_CONTENT_LENGTH_DOWNLOAD Размер полученных данных, прочитанный из заголовка Content-Length:
CURLINFO_CONTENT_LENGTH_UPLOAD Размер переданных данных
CURLINFO_CONTENT_TYPE Значение заголовка Content-Type: запрошенного документа. Значение NULL указывает, что сервер не отправил допустимый заголовок Content-Type:
CURLINFO_PRIVATE Закрытые данные, связанные с текущим дескриптором cURL, которые до этого были установлены функцией curl_setopt() с параметром CURLOPT_PRIVATE
CURLINFO_PROXY_ERROR Подробный код ошибки прокси-сервера (SOCKS), когда последняя передача вернула ошибку CURLE_PROXY. Возвращаемое значение будет равно значению константы из семейства CURLPX_*. Код ошибки будет равен значению константы CURLPX_OK, если код ответа не был доступен
CURLINFO_RESPONSE_CODE Последний код ответа
CURLINFO_HTTP_CONNECTCODE Код ответа на запрос CONNECT
CURLINFO_HTTPAUTH_AVAIL Битовая маска доступного метода или методов аутентификации на основе данных предыдущего ответа
CURLINFO_PROXYAUTH_AVAIL Битовая маска доступного метода или методов аутентификации прокси-сервера на основе данных предыдущего ответа
CURLINFO_OS_ERRNO Значение переменной Errno в случае сбоя соединения. Номер ошибки зависит от ОС и особенностей системы
CURLINFO_NUM_CONNECTS Количество соединений, которые curl пришлось создать, что успешно выполнить предыдущую передачу
CURLINFO_SSL_ENGINES Список поддерживаемых криптодвижков библиотеки OpenSSL
CURLINFO_COOKIELIST Известные куки
CURLINFO_FTP_ENTRY_PATH Путь входа на FTP-сервер
CURLINFO_APPCONNECT_TIME Время в секундах от запуска до установления SSL- или SSH- подключения или рукопожатия с удалённым хостом
CURLINFO_CERTINFO Цепочка сертификатов TLS
CURLINFO_CONDITION_UNMET Информация о невыполненных за отведённое время условиях
CURLINFO_RTSP_CLIENT_CSEQ Следующий CSeq-заголовок RTSP-клиента
CURLINFO_RTSP_CSEQ_RECV Последний полученный заголовок CSeq
CURLINFO_RTSP_SERVER_CSEQ Следующий CSeq-заголовок RTSP-сервера
CURLINFO_RTSP_SESSION_ID Идентификатор RTSP-сессии
CURLINFO_CONTENT_LENGTH_DOWNLOAD_T Размер полученных данных. Это значение считывается из поля Content-Length:. Значение будет равно -1, если размер неизвестен
CURLINFO_CONTENT_LENGTH_UPLOAD_T Размер отправленных данных. Значение будет равно -1, если размер неизвестен
CURLINFO_HTTP_VERSION Версия HTTP-протокола последнего соединении. Возвращаемое значение будет равно значению константы из семейства CURL_HTTP_VERSION_* или 0, если версию невозможно определить
CURLINFO_PROTOCOL Протокол последнего HTTP-соединения. Возвращаемое значение будет равно значению константы из семейства CURLPROTO_*
CURLINFO_PROXY_SSL_VERIFYRESULT Результат запрошенной проверки сертификата (с параметром CURLOPT_PROXY_SSL_VERIFYPEER). Работает только для серверов HTTPS-прокси
CURLINFO_SCHEME Схема URL последнего соединения
CURLINFO_SIZE_DOWNLOAD_T Общее количество байтов, которые были получены. Число будет указано только для последней передачи и будет сбрасываться при каждой новой передаче
CURLINFO_SIZE_UPLOAD_T Общее количество байтов, которые были переданы
CURLINFO_SPEED_DOWNLOAD_T Средняя скорость получения данных в байтах в секунду, которую curl измерил в конце передачи
CURLINFO_SPEED_UPLOAD_T Средняя скорость передачи данных в байтах в секунду, которую curl измерил в конце передачи
CURLINFO_APPCONNECT_TIME_T Время в микросекундах, прошедшее от запуска до завершения SSL- или SSH- подключения или рукопожатия с удалённым хостом
CURLINFO_CONNECT_TIME_T Общее время в микросекундах, прошедшее от запуска до завершения подключения к удалённому хосту или прокси-серверу
CURLINFO_FILETIME_T Время получения документа в виде метки времени Unix по часам удалённого сервера, альтернатива опции CURLINFO_FILETIME, чтобы разрешить системам с 32-битными long-переменными извлекать даты за пределами диапазона 32-битных меток времени
CURLINFO_NAMELOOKUP_TIME_T Время в микросекундах от запуска до разрешения имени
CURLINFO_PRETRANSFER_TIME_T Время в микросекундах от запуска до момента начала передачи файла
CURLINFO_REDIRECT_TIME_T Общее время в микросекундах, которое потребовалось для всех шагов перенаправления, включая поиск имени, подключение, предварительную о основную передачу до запуска окончательной транзакции
CURLINFO_STARTTRANSFER_TIME_T Время в микросекундах от запуска передачи до получения первого байта
CURLINFO_TOTAL_TIME_T Общее время предыдущей передачи в микросекундах, включая разрешение имени, TCP-соединение и т. д.

Возвращаемые значения

Если параметр option задан, возвращается его значение. В остальных случаях возвращается ассоциативный массив со следующими элементами (которые соответствуют значениям параметра option) или false в случае ошибки:

  • «url»
  • «content_type»
  • «http_code»
  • «header_size»
  • «request_size»
  • «filetime»
  • «ssl_verify_result»
  • «redirect_count»
  • «total_time»
  • «namelookup_time»
  • «connect_time»
  • «pretransfer_time»
  • «size_upload»
  • «size_download»
  • «speed_download»
  • «speed_upload»
  • «download_content_length»
  • «upload_content_length»
  • «starttransfer_time»
  • «redirect_time»
  • «certinfo»
  • «primary_ip»
  • «primary_port»
  • «local_ip»
  • «local_port»
  • «redirect_url»
  • «request_header» (Значение будет заполнено, только если функцией curl_setopt() для дескриптора включён параметр CURLINFO_HEADER_OUT.)
Учтите, что закрытые данные не добавляются в ассоциативный массив и извлекаются отдельно через опцию CURLINFO_PRIVATE.

Список изменений

Версия Описание
8.3.0 Добавлены опции CURLINFO_CAINFO и CURLINFO_CAPATH.
8.2.0 Добавлены опции CURLINFO_PROXY_ERROR, CURLINFO_REFERER, CURLINFO_RETRY_AFTER.
8.0.0 handle теперь ожидает экземпляр CurlHandle; раньше, ожидался ресурс (resource).
8.0.0 Теперь параметр option принимает значение null. ранее значением по умолчанию был 0.
7.3.0 Добавлены опции CURLINFO_CONTENT_LENGTH_DOWNLOAD_T, CURLINFO_CONTENT_LENGTH_UPLOAD_T, CURLINFO_HTTP_VERSION, CURLINFO_PROTOCOL, CURLINFO_PROXY_SSL_VERIFYRESULT, CURLINFO_SCHEME, CURLINFO_SIZE_DOWNLOAD_T, CURLINFO_SIZE_UPLOAD_T, CURLINFO_SPEED_DOWNLOAD_T, CURLINFO_SPEED_UPLOAD_T, CURLINFO_APPCONNECT_TIME_T, CURLINFO_CONNECT_TIME_T, CURLINFO_FILETIME_T, CURLINFO_NAMELOOKUP_TIME_T, CURLINFO_PRETRANSFER_TIME_T, CURLINFO_REDIRECT_TIME_T, CURLINFO_STARTTRANSFER_TIME_T, CURLINFO_TOTAL_TIME_T.

Примеры

Пример #1 Пример использования функции curl_getinfo()

<?php

// Создаём дескриптор cURL
$ch = curl_init('http://www.example.com/');

// Запускаем
curl_exec($ch);

// Проверяем наличие ошибок
if (!curl_errno($ch)) {
$info = curl_getinfo($ch);
echo
'Прошло ', $info['total_time'], ' секунд во время запроса к ', $info['url'], "\n";
}

// Закрываем дескриптор
curl_close($ch);

?>

Пример #2 Пример использования функции curl_getinfo() с параметром option

<?php

// Создаём дескриптор cURL
$ch = curl_init('http://www.example.com/');

// Запускаем
curl_exec($ch);

// Проверяем наличие ошибок
if (!curl_errno($ch)) {
switch (
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE)) {
case
200: # OK
break;
default:
echo
'Неожиданный код HTTP: ', $http_code, "\n";
}
}

// Закрываем дескриптор
curl_close($ch);

?>

Примечания

Замечание:

Информация, которую собирает эта функция, хранится в дескрипторе и доступна для запуска повторной передачи. То есть, пока статистика не переопределена внутренне, эта функция возвращает предыдущую информацию.

add a note add a note

User Contributed Notes 13 notes

up
57
ssttoo at hotmail dot com
20 years ago
Here are the response codes ready for pasting in an ini-style file. Can be used to provide more descriptive message, corresponding to 'http_code' index of the arrray returned by curl_getinfo().
These are taken from the W3 consortium HTTP/1.1: Status Code Definitions, found at
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

[Informational 1xx]
100="Continue"
101="Switching Protocols"

[Successful 2xx]
200="OK"
201="Created"
202="Accepted"
203="Non-Authoritative Information"
204="No Content"
205="Reset Content"
206="Partial Content"

[Redirection 3xx]
300="Multiple Choices"
301="Moved Permanently"
302="Found"
303="See Other"
304="Not Modified"
305="Use Proxy"
306="(Unused)"
307="Temporary Redirect"

[Client Error 4xx]
400="Bad Request"
401="Unauthorized"
402="Payment Required"
403="Forbidden"
404="Not Found"
405="Method Not Allowed"
406="Not Acceptable"
407="Proxy Authentication Required"
408="Request Timeout"
409="Conflict"
410="Gone"
411="Length Required"
412="Precondition Failed"
413="Request Entity Too Large"
414="Request-URI Too Long"
415="Unsupported Media Type"
416="Requested Range Not Satisfiable"
417="Expectation Failed"

[Server Error 5xx]
500="Internal Server Error"
501="Not Implemented"
502="Bad Gateway"
503="Service Unavailable"
504="Gateway Timeout"
505="HTTP Version Not Supported"

And an example usage:
<?php
$ch
= curl_init(); // create cURL handle (ch)
if (!$ch) {
    die(
"Couldn't initialize a cURL handle");
}
// set some cURL options
$ret = curl_setopt($ch, CURLOPT_URL,            "http://mail.yahoo.com");
$ret = curl_setopt($ch, CURLOPT_HEADER,         1);
$ret = curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$ret = curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
$ret = curl_setopt($ch, CURLOPT_TIMEOUT,        30);

// execute
$ret = curl_exec($ch);

if (empty(
$ret)) {
   
// some kind of an error happened
   
die(curl_error($ch));
   
curl_close($ch); // close cURL handler
} else {
   
$info = curl_getinfo($ch);
   
curl_close($ch); // close cURL handler

   
if (empty($info['http_code'])) {
            die(
"No HTTP code was returned");
    } else {
       
// load the HTTP codes
       
$http_codes = parse_ini_file("path/to/the/ini/file/I/pasted/above");
       
       
// echo results
       
echo "The server responded: <br />";
        echo
$info['http_code'] . " " . $http_codes[$info['http_code']];
    }

}
?>
up
22
vince
14 years ago
CURLINFO_HTTP_CODE does not return a string, as the docs say, but rather an integer.

<?php
    $c
= curl_init('http://www.example.com/');
    if(
curl_getinfo($c, CURLINFO_HTTP_CODE) === '200') echo "CURLINFO_HTTP_CODE returns a string.";
    if(
curl_getinfo($c, CURLINFO_HTTP_CODE) === 200) echo "CURLINFO_HTTP_CODE returns an integer.";
   
curl_close($c);
?>

returns

"CURLINFO_HTTP_CODE returns an integer."
up
7
public-mail at alekciy dot ru
9 years ago
Note, header_size include "\r\n\r\n". So if you use CURLOPT_FOLLOWLOCATION>0, CURLOPT_HEADER=true, CURLOPT_RETURNTRANSFER=true right way splite header/body:

$response = curl_exec($ch);
$curl_info = curl_getinfo($ch);
curl_close($ch);
$header_size = $curl_info['header_size'];
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);
up
17
nikita dot bulatenko at gmail dot com
11 years ago
CURLINFO_SSL_VERIFYRESULT error codes:
0: ok the operation was successful.
2 : unable to get issuer certificate
3: unable to get certificate CRL
4: unable to decrypt certificate's signature
5: unable to decrypt CRL's signature
6: unable to decode issuer public key
7: certificate signature failure
8: CRL signature failure
9: certificate is not yet valid
10: certificate has expired
11: CRL is not yet valid
12:CRL has expired
13: format error in certificate's notBefore field
14: format error in certificate's notAfter field
15: format error in CRL's lastUpdate field
16: format error in CRL's nextUpdate field
17: out of memory
18: self signed certificate
19: self signed certificate in certificate chain
20: unable to get local issuer certificate
21:unable to verify the first certificate
22: certificate chain too long
23: certificate revoked
24: invalid CA certificate
25: path length constraint exceeded
26: unsupported certificate purpose
27: certificate not trusted
28: certificate rejected
29: subject issuer mismatch
30: authority and subject key identifier mismatch
31: authority and issuer serial number mismatch
32: key usage does not include certificate signing
50: application verification failure
details at http://www.openssl.org/docs/apps/verify.html#VERIFY_OPERATION
up
5
qrworld.net
10 years ago
Here you have a function that I use to get the content of a URL using cURL. This uses curl_getinfo to know if it is a regular URL or maybe a redirection.

I hope it would be useful for you:

function getUrlContent($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
$data = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return ($httpcode>=200 && $httpcode<300) ? $data : false;
}

The source comes from this website:

http://softontherocks.blogspot.com/2014/11/descargar-el-contenido-de-una-url.html
up
6
nemetral
16 years ago
Just a quick note: if you want to use curl_getinfo() with option CURLINFO_HEADER_OUT in order to debug your cURL request, you must add curl_setopt($handle, CURLINFO_HEADER_OUT, true); first while specifying the options.
up
3
bg at enativ dot com
10 years ago
curl_getinfo($ch) will also return 'redirect_url' if there is one (even if CURLOPT_FOLLOWLOCATION set to false).
I don't know why it's not in the doc..
up
2
Mark Evers
16 years ago
There is a constant missing from that list.  CURLINFO_REDIRECT_COUNT will give you the number of redirects it went through if CURLOPT_FOLLOWLOCATION was set.
up
1
Anonymous
14 years ago
The main doc neglects to mention that when the CURLINFO_HEADER_OUT option is set the array returned by this function will included a new property, request_header, that is a string of the headers sent in the request.
up
0
c dot ball1729 at gmail dot com
1 year ago
A note about $curl_info['header_size'] (in response to the example above).

Note that the total includes the size of any received headers suppressed by CURLOPT_SUPPRESS_CONNECT_HEADERS (see: https://curl.se/libcurl/c/CURLINFO_HEADER_SIZE.html) so if you are using a proxy which adds additional headers along with this option, $curl_info['header_size'] will give you the wrong string index based on the headers available in PHP. i.e., it will eat in to the start of the response instead of being the index of the beginning of the response.
up
0
torres dot krys at gmail dot com
9 years ago
If you use curl option CURLOPT_NOBODY = true to test if distant url is available, any sites can send you an http code 400 like Cdiscount Wsdl :

$ch = @curl_init($wsdl);

if($ch === false)
    return false;
       
@curl_setopt($ch, CURLOPT_HEADER         ,true);    // we want headers
@curl_setopt($ch, CURLOPT_NOBODY         ,true);    // dont need body
@curl_setopt($ch, CURLOPT_RETURNTRANSFER ,true);    // catch output (do NOT print!)

@curl_exec($ch);

if(@curl_errno($ch)){   // should be 0
    @curl_close($ch);
    return false;
}

$code = @curl_getinfo($ch, CURLINFO_HTTP_CODE);

Modifying CURLOPT_NOBODY to false, http code sent is 200 otherwise http code is 400 !!!
up
-1
Curly
9 years ago
If you call curl_reset() on a handle that has already been passed to curl_exec(), and then perform a curl_getinfo() on the same handle, you may expect that you get the same result as if you called curl_getinfo() immediately after curl_init(). This is not the case, however. cURL will return the data from the previous execution. If you want to completely reset you actually need to unset the cURL handle and recreate a new one.
up
-15
luiheidsgoeroe at hotmail dot com
16 years ago
Keep in mind that for CURLOPT_RETURNTRANSFER it has to be set with curl_setopt() before execution:

This doesn't work:
<?php
$ch
= curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
var_dump(curl_getinfo($ch,CURLINFO_HEADER_OUT));
?>

This works:
<?php
$ch
= curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_exec($ch);
var_dump(curl_getinfo($ch,CURLINFO_HEADER_OUT));
?>
To Top