PHP 8.3.4 Released!

curl_getinfo

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

curl_getinfoObtém informação sobre uma transferência específica

Descrição

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

Obtém informação sobre a última transferência.

Parâmetros

handle

Um manipulador cURL retornado por curl_init().

option

Pode ser uma das seguintes constantes:

Opção Descrição
CURLINFO_CAINFO Padrão interno do arquivo de certificado CA
CURLINFO_CAPATH Padrão interno do diretório de certificados CA
CURLINFO_EFFECTIVE_URL Última URL efetiva
CURLINFO_HTTP_CODE O último código de resposta. A partir do cURL 7.10.8, é um apelido legado de CURLINFO_RESPONSE_CODE
CURLINFO_FILETIME Horário remoto do documento obtido, com a constante CURLOPT_FILETIME habilitada; se -1 for retornado, o horário do documento é desconhecido
CURLINFO_TOTAL_TIME Tempo total de transação em segundos para a última transferência
CURLINFO_NAMELOOKUP_TIME Tempo em segundos até que a resolução de nome foi concluída
CURLINFO_CONNECT_TIME Tempo em segundos para estabelecer a conexão
CURLINFO_PRETRANSFER_TIME Tempo em segundos do início até logo antes de iniciar a transferência de arquivo
CURLINFO_STARTTRANSFER_TIME Tempo em segundos até que o primeiro byte está para ser transferido
CURLINFO_REDIRECT_COUNT Número de redirecionamentos, com a opção CURLOPT_FOLLOWLOCATION habilitada
CURLINFO_REDIRECT_TIME Tempo em segundos de todos as etapas de redirecionamento antes do início da transação final, com a opção CURLOPT_FOLLOWLOCATION habilitada
CURLINFO_REDIRECT_URL Com a opção CURLOPT_FOLLOWLOCATION desabilitada: URL de redirecionamento encontrada na última transação, que deverá ser requisitada manualmente na sequência. Com a opção CURLOPT_FOLLOWLOCATION desabilitada: isto fica vazio. A URL de redirecionamento neste caso fica disponível em CURLINFO_EFFECTIVE_URL
CURLINFO_PRIMARY_IP Endereço IP da conexão mais recente
CURLINFO_PRIMARY_PORT Porta de destino da conexão mais recente
CURLINFO_LOCAL_IP Endereço IP local (origem) da conexão mais recente
CURLINFO_LOCAL_PORT Porta local (origem) da conexão mais recente
CURLINFO_SIZE_UPLOAD Número total de bytes enviados
CURLINFO_SIZE_DOWNLOAD Número total de bytes recebidos
CURLINFO_SPEED_DOWNLOAD Velocidade média de recepção
CURLINFO_SPEED_UPLOAD Velocidade média de envio
CURLINFO_HEADER_SIZE Tamanho total de todos os cabeçalhos recebidos
CURLINFO_HEADER_OUT A string de requisição enviada. Para que isto funcione, deve-se adicionar a opção CURLINFO_HEADER_OUT ao manipulador chamando-se curl_setopt()
CURLINFO_REFERER O cabeçalho do referenciados
CURLINFO_REQUEST_SIZE Tamanho total de requisições emitidas, atualmente apenas para requisições HTTP
CURLINFO_RETRY_AFTER A informação do cabeçalho Retry-After:, ou zero se não houver cabeçalho válido.
CURLINFO_SSL_VERIFYRESULT Resultado da verificação de certificado SSL requisitada pela habilitação da opção CURLOPT_SSL_VERIFYPEER
CURLINFO_CONTENT_LENGTH_DOWNLOAD Tamanho do conteúdo recebido, lido do campo Content-Length:
CURLINFO_CONTENT_LENGTH_UPLOAD Tamanho especificado do upload
CURLINFO_CONTENT_TYPE Content-Type: do documento requisitado. NULL indica que o servidor não enviou o cabeçalho Content-Type:
CURLINFO_PRIVATE Dados privados associados a este manipulador cURL, previamente configurado com a opção CURLOPT_PRIVATE da função curl_setopt()
CURLINFO_PROXY_ERROR O código de erro detalhado do proxy (SOCKS) quando a transferência mais recente retorna um erro CURLE_PROXY. O valor retornado será exatamente um dos valores CURLPX_*. O código de erro será CURLPX_OK se nenhum código de resposta estiver disponível.
CURLINFO_RESPONSE_CODE O último código de resposta
CURLINFO_HTTP_CONNECTCODE O código de resposta de CONNECT
CURLINFO_HTTPAUTH_AVAIL Máscara de bits indicando os métodos de autenticação disponíveis de acordo com a resposta anterior
CURLINFO_PROXYAUTH_AVAIL Máscara de bits indicando os métodos de autenticação do proxy disponíveis de acordo com a resposta anterior
CURLINFO_OS_ERRNO Número do erro de uma falha de conexão. O número depende da arquitetura e do sistema operacional.
CURLINFO_NUM_CONNECTS Número de conexões que curl teve de criar para concluir a transferência anterior
CURLINFO_SSL_ENGINES Esquemas de criptografia OpenSSL suportados
CURLINFO_COOKIELIST Todos os cookies conhecidos
CURLINFO_FTP_ENTRY_PATH Caminho de entrada no servidor FTP
CURLINFO_APPCONNECT_TIME Tempo em segundos decorrido do início até que a conexão/negociação SSL/SSH ao servidor remoto foi concluída
CURLINFO_CERTINFO Cadeia de certificados TLS
CURLINFO_CONDITION_UNMET Informação sobre condição de tempo não cumprida
CURLINFO_RTSP_CLIENT_CSEQ Próximo CSeq do cliente RTSP
CURLINFO_RTSP_CSEQ_RECV CSeq recentemente recebido
CURLINFO_RTSP_SERVER_CSEQ Próximo CSeq do servidor RTSP
CURLINFO_RTSP_SESSION_ID ID de sessão RTSP
CURLINFO_CONTENT_LENGTH_DOWNLOAD_T O tamanho do conteúdo recebido. Isto é o valor lido do campo Content-Length:. -1 se o tamanho for desconhecido
CURLINFO_CONTENT_LENGTH_UPLOAD_T O tamanho especificado do envio. -1 se o tamanho for desconhecido
CURLINFO_HTTP_VERSION A versão usada na última conexão HTTP. O valor de retorno será uma das constantes CURL_HTTP_VERSION_* definidas ou 0 se a versão não puder ser determinada
CURLINFO_PROTOCOL O protocolo usado na última conexão HTTP. O valor retornado será exatamente uma dos valores CURLPROTO_*
CURLINFO_PROXY_SSL_VERIFYRESULT O resultado da verificação de certificado que foi requisitada (usando a opção CURLOPT_PROXY_SSL_VERIFYPEER). Usado apenas para proxy HTTPS
CURLINFO_SCHEME O esquema de URL usado para a conexão mais recente
CURLINFO_SIZE_DOWNLOAD_T O número total de bytes recebidos. O número refere-se apenas à última transferência e será redefinido para cada nova transferência
CURLINFO_SIZE_UPLOAD_T Número total de bytes enviados
CURLINFO_SPEED_DOWNLOAD_T A velocidade média de recebimento em bytes/segundo que curl mediu para todo o recebimento de dados
CURLINFO_SPEED_UPLOAD_T A velocidade média de envio em bytes/segundo que curl mediu para todo o envio de dados
CURLINFO_APPCONNECT_TIME_T Tempo em microssegundos decorrido do início até que a conexão/negociação SSL/SSH ao servidor remoto tenha sido concluída
CURLINFO_CONNECT_TIME_T Tempo em microssegundos decorrido do início até que a conexão ao servidor remoto (ou proxy) tenha sido concluída
CURLINFO_FILETIME_T Horário remoto do documento recebido (em timestamp Unix), como alternativa a CURLINFO_FILETIME para permitir que sistemas com variáveis de 32 bit extraiam datas fora da faixa de 32-bits
CURLINFO_NAMELOOKUP_TIME_T Tempo em microssegundos do início até que a conclusão da resolução de nome
CURLINFO_PRETRANSFER_TIME_T Tempo decorrido do início até que a transferência de arquivos esteja para iniciar, em microssegundos
CURLINFO_REDIRECT_TIME_T Tempo total em microssegundos decorrido para todas as etapas de redirecionamento incluindo pesquisa de nome, conexão, pré-transferência e transferência, antes do início da transação final
CURLINFO_STARTTRANSFER_TIME_T Tempo em microssegundos decorrido do início até o recebimento do primeiro byte
CURLINFO_TOTAL_TIME_T Tempo total em microssegundos da transferência anterior, including resolução de nome, conexão TCP etc.

Valor Retornado

Se o parâmetro option for fornecido, retorna seu valor. Caso contrário, retorna um array associativo com os elementos a seguir (que correspondem a option), ou false em caso de falha:

  • "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" (Este somente será definido se a opção CURLINFO_HEADER_OUT for configurada por uma chamada prévia a curl_setopt())
Note que dados privados não são incluídos no array associativo e devem ser obtidos individualmente com a opção CURLINFO_PRIVATE.

Exemplos

Exemplo #1 Exemplo de curl_getinfo()

<?php
// Cria um manipulador cURL
$ch = curl_init('http://www.example.com/');

// Executa
curl_exec($ch);

// Verifica se algum erro ocorreu
if (!curl_errno($ch)) {
$info = curl_getinfo($ch);
echo
'Demorou ', $info['total_time'], ' segundos para enviar uma requisição a ', $info['url'], "\n";
}

// Fecha o manipulador
curl_close($ch);
?>

Exemplo #2 Exemplo de curl_getinfo() com parâmetro option

<?php
// Cria um manipulador cURL
$ch = curl_init('http://www.example.com/');

// Executa
curl_exec($ch);

// Verifica o código de estado do HTTP
if (!curl_errno($ch)) {
switch (
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE)) {
case
200: # OK
break;
default:
echo
'Código HTTP inesperado: ', $http_code, "\n";
}
}

// Fecha o manipulador
curl_close($ch);
?>

Notas

Nota:

Informações obtidas por esta função são mantidas se o manipulador for reutilizado. Isto significa que a menos que uma estatística seja substituída internamente por esta função, a informação anterior é retornada.

add a note

User Contributed Notes 14 notes

up
57
ssttoo at hotmail dot com
19 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
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
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
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
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
6
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
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
0
pluk77 at gmail dot com
14 days ago
You can still get the SSL verification result using CURLINFO_SSL_VERIFYRESULT when setting CURLOPT_SSL_VERIFYPEER to FALSE.

Full list of result codes:

0: ok
1: unspecified certificate verification error
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: issuer certificate doesn't have a public key
25: path length constraint exceeded
26: unsuitable 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
33: unable to get CRL issuer certificate
34: unhandled critical extension
35: key usage does not include CRL signing
36: unhandled critical CRL extension
37: invalid non-CA certificate (has CA markings)
38: proxy path length constraint exceeded
39: key usage does not include digital signature
40: proxy certificates not allowed, please set the appropriate flag
41: invalid or inconsistent certificate extension
42: invalid or inconsistent certificate policy extension
43: no explicit policy
44: different CRL scope
45: unsupported extension feature
46: RFC 3779 resource not subset of parent's resources
47: permitted subtree violation
48: excluded subtree violation
49: name constraints minimum and maximum not supported
50: application verification failure
51: unsupported name constraint type
52: unsupported or invalid name constraint syntax
53: unsupported or invalid name syntax
54: CRL path validation error
55: path loop
56: Suite B: certificate version invalid
57: Suite B: invalid public key algorithm
58: Suite B: invalid ECC curve
59: Suite B: invalid signature algorithm
60: Suite B: curve not allowed for this LOS
61: Suite B: cannot sign P-384 with P-256
62: hostname mismatch
63: email address mismatch
64: IP address mismatch
65: no matching DANE TLSA records
66: EE certificate key too weak
67: CA certificate key too weak
68: CA signature digest algorithm too weak
69: invalid certificate verification context
70: issuer certificate lookup error
71: Certificate Transparency required, but no valid SCTs found
72: proxy subject name violation
73: OCSP verification needed
74: OCSP verification failed
75: OCSP unknown cert
76: Cannot find certificate signature algorithm
77: subject signature algorithm and issuer public key algorithm mismatch
78: cert info signature and signature algorithm mismatch
79: invalid CA certificate
80: Path length invalid for non-CA cert
81: Path length given without key usage keyCertSign
82: Key usage keyCertSign invalid for non-CA cert
83: Issuer name empty
84: Subject name empty
85: Missing Authority Key Identifier
86: Missing Subject Key Identifier
87: Empty Subject Alternative Name extension
89: Basic Constraints of CA cert not marked critical
88: Subject empty and Subject Alt Name extension not critical
90: Authority Key Identifier marked critical
91: Subject Key Identifier marked critical
92: CA cert does not include key usage extension
93: Using cert extension requires at least X509v3
94: Certificate public key has explicit ECC parameters
95: Raw public key untrusted, no trusted keys configured

source: https://github.com/openssl/openssl/blob/master/include/openssl/x509_vfy.h.in
https://github.com/openssl/openssl/blob/master/crypto/x509/x509_txt.c
up
0
c dot ball1729 at gmail dot com
9 months 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
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
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
-2
Curly
8 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