curl_getinfo

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

curl_getinfoObtener información sobre una transferencia específica

Descripción

curl_getinfo(resource $ch, int $opt = ?): mixed

Obtiene información sobre la última transferencia.

Parámetros

ch

El recurso cURL devuelto por curl_init().

opt

Esta puede ser una de las siguientes constantes:

  • CURLINFO_EFFECTIVE_URL - Última URL efectiva
  • CURLINFO_HTTP_CODE - El último código de respuesta. A partir de PHP 5.5.0 y cURL 7.10.8, este es un alias heredado de CURLINFO_RESPONSE_CODE
  • CURLINFO_FILETIME - Tiempo remoto del documento recuperado, con la constante CURLOPT_FILETIME habilitada; si -1 es devuelto el tiempo del documento es desconocido
  • CURLINFO_TOTAL_TIME - Tiempo total de transacción en segundos para la última transferencia
  • CURLINFO_NAMELOOKUP_TIME - El tiempo en segundos hasta que la resolución del nombre se haya completado
  • CURLINFO_CONNECT_TIME - El tiempo en segundos que tomó establecer la conexión
  • CURLINFO_PRETRANSFER_TIME - Tiempo en segundos desde el inicio hasta justo antes de que comience la transferencia de archivos
  • CURLINFO_STARTTRANSFER_TIME - Tiempo en segundos hasta que el primer byte está a punto de ser transferido
  • CURLINFO_REDIRECT_COUNT - Número de redirecciones, con la opción CURLOPT_FOLLOWLOCATION habilitada
  • CURLINFO_REDIRECT_TIME - Tiempo en segundos de todos los pasos de redireccionamiento antes de que se iniciara la transacción final, con la opción CURLOPT_FOLLOWLOCATION habilitada
  • CURLINFO_REDIRECT_URL - Con la opción CURLOPT_FOLLOWLOCATION deshabilitadad: redirigir la URL encontrada en la última transacción, que debe ser solicitado manualmente a continuación. Con la opción CURLOPT_FOLLOWLOCATION habilitada: esto está vacío. El URL de redireccionamiento en este caso está disponible en CURLINFO_EFFECTIVE_URL
  • CURLINFO_PRIMARY_IP - La 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 cargados
  • 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 todos los encabezados recibidos
  • CURLINFO_HEADER_OUT - El string de solicitud enviado. Para que esto funcione, agregue la opción CURLINFO_HEADER_OUT al manejador llamando curl_setopt()
  • CURLINFO_REQUEST_SIZE - Tamaño total de las solicitudes emitidas, actualmente sólo para las solicitudes HTTP
  • CURLINFO_SSL_VERIFYRESULT - Resultado de la verificación de la certificación SSL solicitada mediante el ajuste CURLOPT_SSL_VERIFYPEER
  • CURLINFO_CONTENT_LENGTH_DOWNLOAD - Longitud del contenido de la descarga, leído desde el campo Content-Length:
  • CURLINFO_CONTENT_LENGTH_UPLOAD - Tamaño especificado de la carga
  • CURLINFO_CONTENT_TYPE - Content-Type: de el documento. NULL indica que el servidor no envió un encabezado válido Content-Type:
  • CURLINFO_PRIVATE - Los datos privados asociados al manejador cURL, previamente establecido 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 CONNECT
  • CURLINFO_HTTPAUTH_AVAIL - Máscara de bits que indica el(los) método(s) de autenticación disponible(s) según la respuesta anterior
  • CURLINFO_PROXYAUTH_AVAIL - Máscara de bits que indica el(los) método(s) de autenticación del proxy disponible(s) según la respuesta anterior
  • CURLINFO_OS_ERRNO - Número de error de un fallo de conexión. El número es específico del sistema y del sistema operativo.
  • CURLINFO_NUM_CONNECTS - El número de conexiones que Curl tuvo que crear para lograr la transferencia anterior
  • CURLINFO_SSL_ENGINES - Los motores de cifrado OpenSSL soportados
  • CURLINFO_COOKIELIST - Todas las cookies conocidas
  • CURLINFO_FTP_ENTRY_PATH - Ruta de entrada en el servidor FTP
  • CURLINFO_APPCONNECT_TIME - El tiempo en segundos que tomó desde el inicio hasta que la conexión SSL/SSH al host remoto se completó
  • CURLINFO_CERTINFO - Cadena de certificados TLS
  • CURLINFO_CONDITION_UNMET - Información sobre el tiempo condicional no cumplido
  • CURLINFO_RTSP_CLIENT_CSEQ - Próximo cliente de RTSP CSeq
  • CURLINFO_RTSP_CSEQ_RECV - Recién recibido CSeq
  • CURLINFO_RTSP_SERVER_CSEQ - Próximo servidor RTSP CSeq
  • CURLINFO_RTSP_SESSION_ID - ID de la sesión RTSP
  • CURLINFO_CONTENT_LENGTH_DOWNLOAD_T - El contenido de la descarga. Este es el valor leído de el campo Content-Type:. -1 si el tamaño no es conocido
  • CURLINFO_CONTENT_LENGTH_UPLOAD_T - El tamaño especificado de la carga. -1 si no se conoce el tamaño
  • CURLINFO_HTTP_VERSION - La versión usada en la última conexión HTTP. El valor devuelto será una de las constantes CURL_HTTP_VERSION_* constants o 0 si la versión no puede ser determinada
  • CURLINFO_PROTOCOL - El protocolo utilizado en la última conexión HTTP. El valor devuelto será exactamente uno de los valores CURLPROTO_*
  • CURLINFO_PROXY_SSL_VERIFYRESULT - El resultado de la verificación del certificado que se solicitó (usando la opción CURLOPT_PROXY_SSL_VERIFYPEER). Sólo se utiliza para los proxies HTTPS
  • CURLINFO_SCHEME - El esquema de URL usado para la conexión más reciente
  • CURLINFO_SIZE_DOWNLOAD_T - Número total de bytes que se descargaron. El número es sólo para la última transferencia y se restablecerá de nuevo para cada nueva transferencia
  • CURLINFO_SIZE_UPLOAD_T - Número total de bytes que se cargaron
  • CURLINFO_SPEED_DOWNLOAD_T - La velocidad media de descarga en bytes/segundo que cURL midió para la descarga completa
  • CURLINFO_SPEED_UPLOAD_T - La velocidad media de subida en bytes/segundo que cURL midió para la subida completa
  • CURLINFO_APPCONNECT_TIME_T - Tiempo, en microsegundos, que tomó desde el principio hasta que la conexión SSL/SSH al host remoto se completó
  • CURLINFO_CONNECT_TIME_T - Tiempo total tomado, en microsegundos, desde el inicio hasta que se completó la conexión con el host remoto (o proxy)
  • CURLINFO_FILETIME_T - Hora remota del documento recuperado (como la marca de tiempo de Unix), una alternativa a CURLINFO_FILETIME para permitir que los sistemas con variables de 32 bits de largo extraigan fechas fuera del rango de 32 bits de la marca de tiempo
  • CURLINFO_NAMELOOKUP_TIME_T - Tiempo en microsegundos desde el comienzo hasta que el nombre es resuelto.
  • CURLINFO_PRETRANSFER_TIME_T - El tiempo transcurrido desde el inicio hasta la transferencia de archivos está a punto de comenzar, en microsegundos
  • CURLINFO_REDIRECT_TIME_T - El tiempo total, en microsegundos, que tomó para todos los pasos de redireccionamiento incluyen la búsqueda del nombre, la conexión, la pretransferencia y la transferencia antes de que se iniciara la transacción final
  • CURLINFO_STARTTRANSFER_TIME_T - El tiempo, en microsegundos, que tomó desde el inicio hasta que se recibe el primer byte
  • CURLINFO_TOTAL_TIME_T - Tiempo total en microsegundos para la transferencia anterior, incluyendo la resolución de nombres, la conexión TCP, etc.

Valores devueltos

Si se da opt, devuelve este valor. En caso contrario, devuelve un array asociativo con los siguientes valores (que 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" (Esto sólo se establece si CURLINFO_HEADER_OUT se establece por una llamada previa a curl_setopt())
Nótese que los datos privados no están incluidos en el conjunto asociativo y deben recuperarse individualmente con la opción CURLINFO_PRIVATE.

Historial de cambios

Versión Descripción
7.3.0 Introdujo 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.
5.5.0 Introdujo 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 Introdujo CURLINFO_PRIMARY_IP, CURLINFO_PRIMARY_PORT, CURLINFO_LOCAL_IP y CURLINFO_LOCAL_PORT.
5.3.7 Introdujo CURLINFO_REDIRECT_URL.
5.3.0 Introdujo CURLINFO_CERTINFO.
5.2.4 Introdujo CURLINFO_PRIVATE.
5.1.3 Introdujo CURLINFO_HEADER_OUT.

Ejemplos

Ejemplo #1 Ejemplo de curl_getinfo()

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

// Ejecutar
curl_exec($ch);

// Verificar si ocurrió algún error
if (!curl_errno($ch)) {
$info = curl_getinfo($ch);
echo
'Took ', $info['total_time'], ' seconds to send a request to ', $info['url'], "\n";
}

// Close handle
curl_close($ch);
?>

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

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

// Ejecutar
curl_exec($ch);

// Comprueba el código de estado HTTP
if (!curl_errno($ch)) {
switch (
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE)) {
case
200: # OK
break;
default:
echo
'Unexpected HTTP code: ', $http_code, "\n";
}
}

// Close handle
curl_close($ch);
?>

Notas

Nota:

La información recogida por esta función se guarda si el manejador se reutiliza. Esto significa que a menos que una estadística sea anulada internamente por esta función, la información anterior es devuelta.

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