PHP 7.0.6 Released

curl_getinfo

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

curl_getinfoObtener información relativa a una transferencia específica

Descripción

mixed curl_getinfo ( resource $ch [, int $opt = 0 ] )

Obtiene información sobre la última transferencia.

Parámetros

ch

El recurso cURL devuelto por curl_init().

opt

Puede ser una de las siguientes constantes:

  • CURLINFO_EFFECTIVE_URL - Último URL efectivo
  • CURLINFO_HTTP_CODE - Último código HTTP recibido
  • CURLINFO_FILETIME - Hora del documento remoto obtenido; si devuelve -1, la hora del documento es desconocida
  • CURLINFO_TOTAL_TIME - Duración total, en segundos, de última transaferencia
  • CURLINFO_NAMELOOKUP_TIME - Tiempo, en segundos, en resolver el nombre
  • CURLINFO_CONNECT_TIME - Tiempo, en segundos, que tomó el establecimiento de la conexión
  • CURLINFO_PRETRANSFER_TIME - Tiempo, en segundos, desde el inicio hasta justo antes de que comience la transferencia del fichero
  • CURLINFO_STARTTRANSFER_TIME - Tiempo, en sengudos, hasta que el primer byte está a punto de transferirse
  • CURLINFO_REDIRECT_COUNT - Número de redireccionamientos, con la opción CURLOPT_FOLLOWLOCATION habilitada
  • CURLINFO_REDIRECT_TIME - Tiempo, en segundos, de todos los pasos de redireción antes de que la última transación haya empezado, con la opción CURLOPT_FOLLOWLOCATION habilitada
  • CURLINFO_REDIRECT_URL - Con la opción CURLOPT_FOLLOWLOCATION inhabilitada: URL de redirección encontrado en la última transacción, que debería ser solicitado manualmente luego. Con la opción CURLOPT_FOLLOWLOCATION habilitada: está vacío. El URL de redirección en este caso está disponible en CURLINFO_EFFECTIVE_URL
  • CURLINFO_PRIMARY_IP - Dirección IP de la conexión más reciente
  • CURLINFO_PRIMARY_PORT - Puerto de destino de la conexión más reciente
  • CURLINFO_LOCAL_IP - Dirección IP local (fuente) de la conexión más reciente
  • CURLINFO_LOCAL_PORT - Puerto local (fuente) de la conexión más reciente
  • CURLINFO_SIZE_UPLOAD - Número total de bytes subidos
  • CURLINFO_SIZE_DOWNLOAD - Número total de bytes descargados
  • CURLINFO_SPEED_DOWNLOAD - Velocidad media de descarga
  • CURLINFO_SPEED_UPLOAD - Velocidad media de subida
  • CURLINFO_HEADER_SIZE - Tamaño total de los encabezados recibidos
  • CURLINFO_HEADER_OUT - El string de la petición enviada. Para que funcione, se ha de añadir la opción CURLINFO_HEADER_OUT al manejador, llamando a curl_setopt()
  • CURLINFO_REQUEST_SIZE - Tamaño total de las peticiones realizadas, actualmente solo para peticiones HTTP
  • CURLINFO_SSL_VERIFYRESULT - Resultado de la verificación del certificado SSL solicitado por la opción CURLOPT_SSL_VERIFYPEER
  • CURLINFO_CONTENT_LENGTH_DOWNLOAD - Logitud del contenido de la descarga, leída desde el campo Content-Length:
  • CURLINFO_CONTENT_LENGTH_UPLOAD - Tamaño especificado de subida
  • CURLINFO_CONTENT_TYPE - Content-Type: del documento solicitado. NULL indica que el servidor no envío un encabezado Content-Type: válido.
  • CURLINFO_PRIVATE - Datos privados asociados a este manejador de cURL, previamente establecidos con la opción CURLOPT_PRIVATE de curl_setopt()
  • CURLINFO_RESPONSE_CODE - El último código de respuesta
  • CURLINFO_HTTP_CONNECTCODE - El código de respuesta de CONNECT
  • CURLINFO_HTTPAUTH_AVAIL - Máscara de bits que indica el/los método/s de autenticación disponible/s de acuerdo a la respuesta anterior
  • CURLINFO_PROXYAUTH_AVAIL - Máscara de bits que indica el/los método/s de autenticaición proxy disponible/s de acuerdo a la respuesta anterior
  • CURLINFO_OS_ERRNO - Número de error (errno) de un fallo de conexion. Es número es específico de cada SO y sistema
  • CURLINFO_NUM_CONNECTS - Número de conexiones que curl ha tenido que crear para lograr la transferencia anterior
  • CURLINFO_SSL_ENGINES - Criptomotores OpenSSL admitidos
  • CURLINFO_COOKIELIST - Todas las cookies conocidas
  • CURLINFO_FTP_ENTRY_PATH - Ruta de entrada en el servidor FTP
  • CURLINFO_APPCONNECT_TIME - Tiempo, en segundos, desde el inicio hasta la conexión/apretón de manos SSL/SSH del host remoto
  • CURLINFO_CERTINFO - Serie de certificados TLS
  • CURLINFO_CONDITION_UNMET - Información del condicional de timepo unmet
  • CURLINFO_RTSP_CLIENT_CSEQ - Siguiente CSeq cliente de RTSP
  • CURLINFO_RTSP_CSEQ_RECV - CSeq recivido recientemente
  • CURLINFO_RTSP_SERVER_CSEQ - Siguiente CSeq servidor de RTSP
  • CURLINFO_RTSP_SESSION_ID - ID de sesión de RTSP

Valores devueltos

Si se indica el parámetro, opt, devolverá su valor. De lo contrario, devolverá un array asociativo con los siguientes elementos (que se corresponden a opt), o FALSE en caso de error:

  • "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" (Solamente está definido si CURLINFO_HEADER_OUT está establecido por una llamada previa a curl_setopt())
Observe que los datos privados no están incluídos en el array asociativo, por lo que deben obtenerse individualmente con con la opción CURLINFO_PRIVATE.

Historial de cambios

Versión Descripción
5.5.0 Se introdujeron CURLINFO_RESPONSE_CODE, CURLINFO_HTTP_CONNECTCODE, CURLINFO_HTTPAUTH_AVAIL, CURLINFO_PROXYAUTH_AVAIL, CURLINFO_OS_ERRNO, CURLINFO_NUM_CONNECTS, CURLINFO_SSL_ENGINES, CURLINFO_COOKIELIST, CURLINFO_FTP_ENTRY_PATH, CURLINFO_APPCONNECT_TIME, CURLINFO_CONDITION_UNMET, CURLINFO_RTSP_CLIENT_CSEQ, CURLINFO_RTSP_CSEQ_RECV, CURLINFO_RTSP_SERVER_CSEQ y CURLINFO_RTSP_SESSION_ID.
5.4.7 Se introdujeros CURLINFO_PRIMARY_IP, CURLINFO_PRIMARY_PORT, CURLINFO_LOCAL_IP y CURLINFO_LOCAL_PORT.
5.3.7 Se introdujo CURLINFO_REDIRECT_URL.
5.3.0 Se introdujo CURLINFO_CERTINFO.
5.2.4 Se introdujo CURLINFO_PRIVATE.
5.1.3 Se introdujo CURLINFO_HEADER_OUT.

Ejemplos

Ejemplo #1 Ejemplo de curl_getinfo()

<?php
// Crear un manejador de cURL
$ch curl_init('http://www.example.com/');

// Ejecutar
curl_exec($ch);

// Comprobar si ocurrió un error
if (!curl_errno($ch)) {
  
$info curl_getinfo($ch);
  echo 
'Se tardó '$info['total_time'], ' segundos en enviar una petición a '$info['url'], "\n";
}

// Cerrar el manejador
curl_close($ch);
?>

Ejemplo #2 Ejemplo de curl_getinfo() con el parámetro opt

<?php
// Crear un manejador de cURL
$ch curl_init('http://www.example.com/');

// Ejecutar
curl_exec($ch);

// Comprobar el código de estado HTTP
if (!curl_errno($ch)) {
  switch (
$http_code curl_getinfo($chCURLINFO_HTTP_CODE)) {
    case 
200:  # OK
      
break;
    default:
      echo 
'Código HTTP inesperado: '$http_code"\n";
  }
}

// Cerrar el manejador
curl_close($ch);
?>

Notas

Nota:

La información obtenida por esta función se mantiene si se reutiliza el manejador. Esto significa que, a no ser que una estadística sea sobrescrita internamente por esta función, se devolverá la información previa.

add a note add a note

User Contributed Notes 13 notes

up
29
ssttoo at hotmail dot com
12 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
8
bg at enativ dot com
2 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
7
Mark Evers
8 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
6
nemetral
7 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
1
torres dot krys at gmail dot com
9 months 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
5
nikita dot bulatenko at gmail dot com
3 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
2
vince
5 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
1
Anonymous
5 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
qrworld.net
1 year 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
-1
public-mail at alekciy dot ru
5 months 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
-1
Curly
1 year 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
-2
luiheidsgoeroe at hotmail dot com
8 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
-22
Piker
2 years ago
Example 1 should use "if(curl_errno($ch))" not "if(!curl_errno($ch))"
To Top