curl_getinfo

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

curl_getinfoВозвращает информацию об определённой операции

Описание

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

Возвращает информацию о последней операции.

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

handle

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

option

Одна из перечисленных констант:

  • CURLINFO_EFFECTIVE_URL - Последний использованный URL
  • CURLINFO_HTTP_CODE - Последний код ответа. Начиная с cURL 7.10.8, это устаревший псевдоним CURLINFO_RESPONSE_CODE
  • CURLINFO_FILETIME - Удалённая (серверная) дата загруженного документа, если включена опция CURLOPT_FILETIME; если получено -1, значит это время неизвестно
  • CURLINFO_TOTAL_TIME - Общее время выполнения транзакции в секундах последней передачи
  • CURLINFO_NAMELOOKUP_TIME - Время разрешения имени сервера в секундах
  • CURLINFO_CONNECT_TIME - Время в секундах, затраченное на установку соединения
  • CURLINFO_PRETRANSFER_TIME - Время в секундах, прошедшее от начала операции до готовности к фактической передаче данных
  • CURLINFO_STARTTRANSFER_TIME - Время в секундах до передачи первого байта данных
  • CURLINFO_REDIRECT_COUNT - Число перенаправлений с включённой опцией CURLOPT_FOLLOWLOCATION
  • CURLINFO_REDIRECT_TIME - Общее время в секундах, затраченное на перенаправления до начала последней транзакции с включённой опцией CURLOPT_FOLLOWLOCATION
  • 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_REQUEST_SIZE - Суммарный размер всех отправленных запросов, в настоящее время используется только для HTTP-запросов
  • 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-обработчиком, ранее установленные с помощью опции CURLOPT_PRIVATE в функции curl_setopt()
  • CURLINFO_RESPONSE_CODE - Последний код возврата
  • CURLINFO_HTTP_CONNECTCODE - Код ответа операции CONNECT
  • CURLINFO_HTTPAUTH_AVAIL - Битовая маска, показывающая возможные методы аутентификации, доступные при предыдущем ответе
  • CURLINFO_PROXYAUTH_AVAIL - Битовая маска, показывающая возможные методы аутентификации на прокси, доступные при предыдущем ответе
  • CURLINFO_OS_ERRNO - Номер ошибки при попытке соединения. Код может различаться в зависимости от системы и ОС
  • CURLINFO_NUM_CONNECTS - Количество соединений, совершенных curl для обеспечения предыдущей передачи
  • CURLINFO_SSL_ENGINES - Поддержка OpenSSL
  • CURLINFO_COOKIELIST - Все известные куки
  • CURLINFO_FTP_ENTRY_PATH - Путь входа на FTP-сервер
  • CURLINFO_APPCONNECT_TIME - Время в секундах от начала и до установления SSL/SSH connect/handshake с удалённым хостом
  • CURLINFO_CERTINFO - связка ключей TLS
  • CURLINFO_CONDITION_UNMET - информация о неудовлетворённых временных условиях
  • CURLINFO_RTSP_CLIENT_CSEQ - Следующий RTSP клиентского CSeq
  • CURLINFO_RTSP_CSEQ_RECV - Недавно полученный CSeq
  • CURLINFO_RTSP_SERVER_CSEQ - Следующий RTSP серверного CSeq
  • CURLINFO_RTSP_SESSION_ID - ID сессии RTSP
  • CURLINFO_CONTENT_LENGTH_DOWNLOAD_T - Content-length загрузки. Это значение считывается из поля Content-Type:. -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 - Средняя скорость скачивания в байтах/секунду, измеренная для полного скачивания
  • CURLINFO_SPEED_UPLOAD_T - Средняя скорость загрузки в байтах/секунду, измеренная для полной загрузки
  • 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" (возвращается только при установленной опции CURLINFO_HEADER_OUT с помощью вызова curl_setopt() до выполнения запроса)
Учтите, что внутренние данные не добавляются в ассоциативный массив и должны получаться отдельно с помощью опции CURLINFO_PRIVATE.

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

Версия Описание
8.0.0 handle теперь ожидает экземпляр CurlHandle; раньше, ожидался ресурс (resource).
8.0.0 option is nullable now; previously, the default was 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($chCURLINFO_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
54
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
7
qrworld.net
9 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
13
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
13
vince
13 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
nemetral
15 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
6
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
2
public-mail at alekciy dot ru
8 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
5
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
0
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
0
Anonymous
13 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
-1
torres dot krys at gmail dot com
8 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
-13
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));
?>
up
-56
Piker
10 years ago
Example 1 should use "if(curl_errno($ch))" not "if(!curl_errno($ch))"
To Top