curl_getinfo

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

curl_getinfo获取有关特定传输的信息

描述

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

获取有关上次传输的信息。

参数

handle

curl_init() 返回的 cURL 句柄。

option

这可能是以下常量之一

选项 描述
CURLINFO_CAINFO 默认内置 CA 证书路径
CURLINFO_CAPATH 默认内置 CA 路径字符串
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 发送的请求字符串。要使此功能正常工作,请通过调用 curl_setopt() 将 CURLINFO_HEADER_OUT 选项添加到句柄
CURLINFO_REFERER 引用标头
CURLINFO_REQUEST_SIZE 已发布请求的总大小,目前仅适用于 HTTP 请求
CURLINFO_RETRY_AFTER 来自 Retry-After: 标头的信息,如果不存在有效标头,则为零。
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: 标头
CURLINFO_PRIVATE 与该 cURL 句柄关联的私有数据,以前使用 curl_setopt() 的 CURLOPT_PRIVATE 选项设置
CURLINFO_PROXY_ERROR 最近一次传输返回 CURLE_PROXY 错误时的详细(SOCKS)代理错误代码。返回值将与 CURLPX_* 值完全相同。如果不可用响应代码,则错误代码将为 CURLPX_OK。
CURLINFO_RESPONSE_CODE 最后一个响应代码
CURLINFO_HTTP_CONNECTCODE CONNECT 响应代码
CURLINFO_HTTPAUTH_AVAIL 位掩码,指示根据先前的响应可用的身份验证方法
CURLINFO_PROXYAUTH_AVAIL 位掩码,指示根据先前的响应可用的代理身份验证方法
CURLINFO_OS_ERRNO 来自连接失败的 Errno。数字是特定于操作系统和系统的。
CURLINFO_NUM_CONNECTS curl 必须创建以完成先前的传输的连接数
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-Length: 字段读取的值。如果大小未知,则为 -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 curl 为整个下载测量的平均下载速度(以字节/秒为单位)
CURLINFO_SPEED_UPLOAD_T curl 为整个上传测量的平均上传速度(以字节/秒为单位)
CURLINFO_APPCONNECT_TIME_T 从开始到 SSL/SSH 连接/握手到远程主机完成所花费的时间(以微秒为单位)
CURLINFO_CONNECT_TIME_T 从开始到与远程主机(或代理)的连接完成所花费的总时间(以微秒为单位)
CURLINFO_FILETIME_T 检索文档的远程时间(作为 Unix 时间戳),作为 CURLINFO_FILETIME 的替代方案,允许具有 32 位长变量的系统提取 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"(仅当以前对 curl_setopt() 的调用设置了 CURLINFO_HEADER_OUT 时才设置)
请注意,私有数据未包含在关联数组中,必须使用 CURLINFO_PRIVATE 选项单独检索。

示例

示例 #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);

// 检查 HTTP 状态码
if (!curl_errno($ch)) {
switch (
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE)) {
case
200: # OK
break;
default:
echo
'意外的 HTTP 代码: ', $http_code, "\n";
}
}

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

备注

注意:

如果句柄被重复使用,则该函数收集的信息会被保留。这意味着,除非该函数内部覆盖了某个统计信息,否则将返回之前的信息。

添加备注

用户贡献备注 16 个备注

58
ssttoo at hotmail dot com
20 年前
以下是可以粘贴到 ini 风格文件中的响应代码。可用于提供更具描述性的消息,对应于由 curl_getinfo() 返回的数组的“http_code”索引。
这些代码取自 W3 联盟的 HTTP/1.1:状态码定义,位于
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

[信息类 1xx]
100="继续"
101="切换协议"

[成功类 2xx]
200="OK"
201="已创建"
202="已接受"
203="非权威信息"
204="无内容"
205="重置内容"
206="部分内容"

[重定向类 3xx]
300="多种选择"
301="永久移动"
302="已找到"
303="查看其他"
304="未修改"
305="使用代理"
306="(未使用)"
307="临时重定向"

[客户端错误类 4xx]
400="错误的请求"
401="未授权"
402="需要付款"
403="禁止"
404="未找到"
405="方法不允许"
406="不可接受"
407="需要代理身份验证"
408="请求超时"
409="冲突"
410="已消失"
411="需要长度"
412="先决条件失败"
413="请求实体过大"
414="请求 URI 过长"
415="不支持的媒体类型"
416="请求的范围无法满足"
417="期望失败"

[服务器错误类 5xx]
500="内部服务器错误"
501="未实现"
502="错误的网关"
503="服务不可用"
504="网关超时"
505="不支持的 HTTP 版本"

以及一个示例用法
<?php
$ch
= curl_init(); // 创建 cURL 句柄 (ch)
if (!$ch) {
die(
"无法初始化 cURL 句柄");
}
// 设置一些 cURL 选项
$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);

// 执行
$ret = curl_exec($ch);

if (empty(
$ret)) {
// 发生了一些错误
die(curl_error($ch));
curl_close($ch); // 关闭 cURL 句柄
} else {
$info = curl_getinfo($ch);
curl_close($ch); // 关闭 cURL 句柄

if (empty($info['http_code'])) {
die(
"未返回 HTTP 代码");
} else {
// 加载 HTTP 代码
$http_codes = parse_ini_file("path/to/the/ini/file/I/pasted/above");

// 回显结果
echo "服务器响应: <br />";
echo
$info['http_code'] . " " . $http_codes[$info['http_code']];
}

}
?>
22
vince
13 年前
CURLINFO_HTTP_CODE 未按文档所说返回字符串,而是返回整数。

<?php
$c
= curl_init('http://www.example.com/');
if(
curl_getinfo($c, CURLINFO_HTTP_CODE) === '200') echo "CURLINFO_HTTP_CODE 返回字符串.";
if(
curl_getinfo($c, CURLINFO_HTTP_CODE) === 200) echo "CURLINFO_HTTP_CODE 返回整数.";
curl_close($c);
?>

返回

"CURLINFO_HTTP_CODE 返回整数."
7
public-mail at alekciy dot ru
8 年前
注意,header_size 包括 "\r\n\r\n"。因此,如果您以正确的方式使用 CURLOPT_FOLLOWLOCATION>0,CURLOPT_HEADER=true,CURLOPT_RETURNTRANSFER=true,则可以正确分割 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);
16
nikita dot bulatenko at gmail dot com
11 年前
CURLINFO_SSL_VERIFYRESULT 错误代码
0: ok 操作成功。
2: 无法获取颁发者证书
3: 无法获取证书 CRL
4: 无法解密证书的签名
5: 无法解密 CRL 的签名
6: 无法解码颁发者公钥
7: 证书签名失败
8: CRL 签名失败
9: 证书尚未生效
10: 证书已过期
11: CRL 尚未生效
12:CRL 已过期
13: 证书 notBefore 字段中的格式错误
14: 证书 notAfter 字段中的格式错误
15: CRL lastUpdate 字段中的格式错误
16: CRL nextUpdate 字段中的格式错误
17: 内存不足
18: 自签名证书
19: 证书链中的自签名证书
20: 无法获取本地颁发者证书
21: 无法验证第一个证书
22: 证书链过长
23: 证书已吊销
24: 无效 CA 证书
25: 路径长度限制超出
26: 不支持的证书用途
27: 证书不受信任
28: 证书被拒绝
29: 发行人主体不匹配
30: 机构和主体密钥标识符不匹配
31: 机构和发行人序列号不匹配
32: 密钥使用不包含证书签名
50: 应用程序验证失败
详情请见 http://www.openssl.org/docs/apps/verify.html#VERIFY_OPERATION
5
qrworld.net
9 年前
以下是一个我用来获取 URL 内容的 cURL 函数。它使用 curl_getinfo 来判断 URL 是普通 URL 还是重定向 URL。

希望对您有所帮助。

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;
}

代码来源:

http://softontherocks.blogspot.com/2014/11/descargar-el-contenido-de-una-url.html
7
nemetral
16 年前
一个小提示:如果您想使用 curl_getinfo() 和选项 CURLINFO_HEADER_OUT 来调试您的 cURL 请求,您必须首先在指定选项时添加 curl_setopt($handle, CURLINFO_HEADER_OUT, true);。
3
bg at enativ dot com
10 年前
curl_getinfo($ch) 也会返回 'redirect_url'(即使 CURLOPT_FOLLOWLOCATION 设置为 false)。
我不知道为什么文档中没有提到这一点。
2
Mark Evers
16 年前
该列表中缺少一个常量。CURLINFO_REDIRECT_COUNT 会在设置了 CURLOPT_FOLLOWLOCATION 的情况下为您提供重定向的次数。
0
xggrquplbSa at seo-laboratory dot ru
14 天前
如何学习唱歌并在舞台上表演:声乐课程
声乐老师 <a href=https://uroki-vocala-msk.ru/>https://uroki-vocala-msk.ru/</a> .
0
pluk77 at gmail dot com
5 个月前
您仍然可以在将 CURLOPT_SSL_VERIFYPEER 设置为 FALSE 时使用 CURLINFO_SSL_VERIFYRESULT 获取 SSL 验证结果。

结果代码完整列表

0: ok
1: 未指定的证书验证错误
2: 无法获取发行人证书
3: 无法获取证书 CRL
4: 无法解密证书的签名
5: 无法解密 CRL 的签名
6: 无法解码颁发者公钥
7: 证书签名失败
8: CRL 签名失败
9: 证书尚未生效
10: 证书已过期
11: CRL 尚未生效
12: CRL 已过期
13: 证书 notBefore 字段中的格式错误
14: 证书 notAfter 字段中的格式错误
15: CRL lastUpdate 字段中的格式错误
16: CRL nextUpdate 字段中的格式错误
17: 内存不足
18: 自签名证书
19: 证书链中存在自签名证书
20: 无法获取本地颁发者证书
21: 无法验证第一个证书
22: 证书链过长
23: 证书已吊销
24: 发行人证书没有公钥
25: 路径长度限制超出
26: 不合适的证书用途
27: 证书不受信任
28: 证书被拒绝
29: 发行人主体不匹配
30: 机构和主体密钥标识符不匹配
31: 机构和发行人序列号不匹配
32: 密钥使用不包含证书签名
33: 无法获取 CRL 发行人证书
34: 未处理的严重扩展
35: 密钥使用不包含 CRL 签名
36: 未处理的严重 CRL 扩展
37: 无效的非 CA 证书(具有 CA 标记)
38: 代理路径长度限制超出
39: 密钥使用不包含数字签名
40: 不允许代理证书,请设置适当的标志
41: 无效或不一致的证书扩展
42: 无效或不一致的证书策略扩展
43: 没有明确的策略
44: 不同的 CRL 范围
45: 不支持的扩展功能
46: RFC 3779 资源不是父资源的子集
47: 允许的子树违反
48: 排除的子树违反
49: 名称约束最小值和最大值不支持
50: 应用程序验证失败
51: 不支持的名称约束类型
52: 不支持或无效的名称约束语法
53: 不支持或无效的名称语法
54: CRL 路径验证错误
55: 路径循环
56: Suite B: 证书版本无效
57: Suite B: 无效的公钥算法
58: Suite B: 无效的 ECC 曲线
59: Suite B: 无效的签名算法
60: Suite B: 此 LOS 不允许使用曲线
61: Suite B: 无法使用 P-256 签名 P-384
62: 主机名不匹配
63: 电子邮件地址不匹配
64: IP 地址不匹配
65: 没有匹配的 DANE TLSA 记录
66: EE 证书密钥太弱
67: CA 证书密钥太弱
68: CA 签名摘要算法太弱
69: 无效的证书验证上下文
70: 发行人证书查找错误
71: 需要证书透明度,但未找到有效的 SCT
72: 代理主体名称违反
73: 需要 OCSP 验证
74: OCSP 验证失败
75: OCSP 未知证书
76: 无法找到证书签名算法
77: 主体签名算法和发行人公钥算法不匹配
78: 证书信息签名和签名算法不匹配
79: 无效的 CA 证书
80: 非 CA 证书的路径长度无效
81: 在没有密钥使用 keyCertSign 的情况下给出路径长度
82: 非 CA 证书的密钥使用 keyCertSign 无效
83: 发行人名称为空
84: 主体名称为空
85: 缺少机构密钥标识符
86: 缺少主体密钥标识符
87: 主体备用名称扩展为空
89: CA 证书的基本约束未标记为严重
88: 主体为空且主体备用名称扩展不为严重
90: 机构密钥标识符标记为严重
91: 主体密钥标识符标记为严重
92: CA 证书不包含密钥使用扩展
93: 使用证书扩展需要至少 X509v3
94: 证书公钥具有显式 ECC 参数
95: 原始公钥不受信任,没有配置信任的密钥

来源: 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
0
c dot ball1729 at gmail dot com
1 年前
关于 $curl_info['header_size'](针对上面的示例)的一点说明。

请注意,总大小包括任何被 CURLOPT_SUPPRESS_CONNECT_HEADERS 抑制的接收到的标头的大小(参见: https://curl.se/libcurl/c/CURLINFO_HEADER_SIZE.html),因此如果您使用的是在使用此选项的同时添加额外标头的代理,则 $curl_info['header_size'] 将根据 PHP 中可用的标头为您提供错误的字符串索引。也就是说,它会吞噬响应的开头,而不是作为响应开头的索引。
0
torres dot krys at gmail dot com
9 年前
如果您使用 curl 选项 CURLOPT_NOBODY = true 来测试远程 URL 是否可用,任何站点都可以向您发送 http 代码 400,例如 Cdiscount Wsdl

$ch = @curl_init($wsdl);

if($ch === false)
return false;

@curl_setopt($ch, CURLOPT_HEADER ,true); // 我们需要标头
@curl_setopt($ch, CURLOPT_NOBODY ,true); // 不需要主体
@curl_setopt($ch, CURLOPT_RETURNTRANSFER ,true); // 捕获输出(不要打印!)

@curl_exec($ch);

if(@curl_errno($ch)){ // 应该为 0
@curl_close($ch);
return false;
}

$code = @curl_getinfo($ch, CURLINFO_HTTP_CODE);

将 CURLOPT_NOBODY 修改为 false,发送的 http 代码为 200,否则 http 代码为 400 !!!
0
Anonymous
14 年前
主要文档没有提到的是,当设置 CURLINFO_HEADER_OUT 选项时,此函数返回的数组将包含一个新的属性 request_header,它是请求中发送的标头的字符串。
-2
Curly
9 年前
如果您对已经传递给 curl_exec() 的句柄调用 curl_reset(),然后对同一个句柄执行 curl_getinfo(),您可能会期望得到与在 curl_init() 之后立即调用 curl_getinfo() 相同的结果。但实际上并非如此。cURL 将返回上一次执行的数据。如果您想完全重置,实际上需要取消设置 cURL 句柄并重新创建一个新的句柄。
-15
luiheidsgoeroe at hotmail dot com
16 年前
请记住,对于 CURLOPT_RETURNTRANSFER,必须在执行之前使用 curl_setopt() 设置它。

以下代码无效
<?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));
?>

以下代码有效
<?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