curl_getinfo

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

curl_getinfo获取一个cURL连接资源句柄的信息

说明

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

获取最后一次传输的相关信息。

参数

handle

curl_init() 返回的 cURL 句柄。

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 在上次事务中找到,接下来应该手动请求。With the CURLOPT_FOLLOWLOCATION option enabled: this is empty. The redirect URL in this case is available in 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——检索到的所有 header 大小
  • CURLINFO_HEADER_OUT——发送请求的字符串。为此,通过调用 curl_setopt()CURLINFO_HEADER_OUT 选项添加到句柄
  • CURLINFO_REQUEST_SIZE——已发出请求的总大小,当前仅针对 HTTP 请求
  • CURLINFO_SSL_VERIFYRESULT——通过设置 CURLOPT_SSL_VERIFYPEER 请求的 SSL 认证验证结果
  • CURLINFO_CONTENT_LENGTH_DOWNLOAD——从 Content-Length: 字段中读取的下载内容长度
  • CURLINFO_CONTENT_LENGTH_UPLOAD——上传指定大小
  • CURLINFO_CONTENT_TYPE——Content-Type:所请求文档的类型。NULL 表示服务器没有发送有效的 Content-Type: header
  • CURLINFO_PRIVATE——与此 cURL 句柄关联的私有数据,之前使用 curl_setopt()CURLOPT_PRIVATE 选项设置
  • CURLINFO_RESPONSE_CODE——最后的响应代码
  • CURLINFO_HTTP_CONNECTCODE——CONNECT 响应代码
  • CURLINFO_HTTPAUTH_AVAIL——位掩码表示先前响应可用的身份验证方法
  • CURLINFO_PROXYAUTH_AVAIL——位掩码表示先前响应可用的代理身份验证方法
  • CURLINFO_OS_ERRNO——来自连接失败的 Errno。该数字特定于 OS 和指定系统。
  • CURLINFO_NUM_CONNECTS - Number of connections curl had to create to achieve the previous transfer
  • CURLINFO_SSL_ENGINES——支持 OpenSSL 加密引擎
  • CURLINFO_COOKIELIST——所有已知的 cookie
  • CURLINFO_FTP_ENTRY_PATH——FTP 服务器中的入口路径
  • CURLINFO_APPCONNECT_TIME——从开始到SSL/SSH 完成与远程主机的连接/握手所花费的时间(以秒为单位)
  • 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——RTSP 会话 ID
  • CURLINFO_CONTENT_LENGTH_DOWNLOAD_T——下载的内容长度。此值从 Content-Type: 字段读取。如果大小未知则为 -1
  • CURLINFO_CONTENT_LENGTH_UPLOAD_T——上传的指定大小。如果未知则为 -1
  • CURLINFO_HTTP_VERSION - The version used in the last HTTP connection. The return value will be one of the defined CURL_HTTP_VERSION_* constants or 0 if the version can't be determined
  • CURLINFO_PROTOCOL - The protocol used in the last HTTP connection. The returned value will be exactly one of the CURLPROTO_* values
  • CURLINFO_PROXY_SSL_VERIFYRESULT - The result of the certificate verification that was requested (using the CURLOPT_PROXY_SSL_VERIFYPEER option). Only used for HTTPS proxies
  • CURLINFO_SCHEME - The URL scheme used for the most recent connection
  • CURLINFO_SIZE_DOWNLOAD_T - Total number of bytes that were downloaded. The number is only for the latest transfer and will be reset again for each new transfer
  • CURLINFO_SIZE_UPLOAD_T——上传的总字节数
  • CURLINFO_SPEED_DOWNLOAD_T - The average download speed in bytes/second that curl measured for the complete download
  • CURLINFO_SPEED_UPLOAD_T - The average upload speed in bytes/second that curl measured for the complete upload
  • CURLINFO_APPCONNECT_TIME_T - Time, in microseconds, it took from the start until the SSL/SSH connect/handshake to the remote host was completed
  • CURLINFO_CONNECT_TIME_T - Total time taken, in microseconds, from the start until the connection to the remote host (or proxy) was completed
  • CURLINFO_FILETIME_T - Remote time of the retrieved document (as Unix timestamp), an alternative to CURLINFO_FILETIME to allow systems with 32 bit long variables to extract dates outside of the 32bit timestamp range
  • CURLINFO_NAMELOOKUP_TIME_T——从开始到名称解析完成的时间(以微秒为单位)
  • CURLINFO_PRETRANSFER_TIME_T - Time taken from the start until the file transfer is just about to begin, in microseconds
  • CURLINFO_REDIRECT_TIME_T - Total time, in microseconds, it took for all redirection steps include name lookup, connect, pretransfer and transfer before final transaction was started
  • 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.0.0 handle expects a CurlHandle instance now; previously, a resource was expected.
8.0.0 option 现在可为 null;之前默认值是 0
7.3.0 引入 CURLINFO_CONTENT_LENGTH_DOWNLOAD_TCURLINFO_CONTENT_LENGTH_UPLOAD_TCURLINFO_HTTP_VERSIONCURLINFO_PROTOCOLCURLINFO_PROXY_SSL_VERIFYRESULTCURLINFO_SCHEMECURLINFO_SIZE_DOWNLOAD_TCURLINFO_SIZE_UPLOAD_TCURLINFO_SPEED_DOWNLOAD_TCURLINFO_SPEED_UPLOAD_TCURLINFO_APPCONNECT_TIME_TCURLINFO_CONNECT_TIME_TCURLINFO_FILETIME_TCURLINFO_NAMELOOKUP_TIME_TCURLINFO_PRETRANSFER_TIME_TCURLINFO_REDIRECT_TIME_TCURLINFO_STARTTRANSFER_TIME_TCURLINFO_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
'Took ', $info['total_time'], ' seconds to send a request to ', $info['url'], "\n";
}

// 关闭句柄
curl_close($ch);
?>

示例 #2 使用 option 参数的 curl_getinfo() 示例

<?php
// 创建 cURL 句柄
$ch = curl_init('http://www.example.com/');

// 执行
curl_exec($ch);

// 检测 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";
}
}

// 关闭句柄
curl_close($ch);
?>

注释

注意:

如果重新使用句柄,则保留此函数收集的信息。这意味着除非此函数在内部覆盖统计信息,否则将返回以前的信息。

add a note

User Contributed Notes 12 notes

up
59
ssttoo at hotmail dot com
18 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
21
vince
12 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
16
nikita dot bulatenko at gmail dot com
10 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
public-mail at alekciy dot ru
7 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
4
qrworld.net
8 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
5
nemetral
14 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
9 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
3
Mark Evers
15 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
12 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
Curly
7 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
-1
torres dot krys at gmail dot com
7 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
-14
luiheidsgoeroe at hotmail dot com
15 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