PHP Conference Japan 2024

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_* 常量之一。

返回值

如果提供了 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 时才设置)
  • "posttransfer_time_us"(从 PHP 8.4.0 和 cURL 8.10.0 开始可用)
请注意,关联数组中不包含私有数据,必须使用 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 使用 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
'意外的 HTTP 代码: ', $http_code, "\n";
}
}

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

注释

注意:

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

添加注释

用户贡献的注释 15 条注释

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="确定"
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']];
}

}
?>
23
vince
14 年前
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
9 年前
注意,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);
15
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
10 年前
这里有一个我用来使用 cURL 获取 URL 内容的函数。它使用 curl_getinfo 来判断它是否是常规 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 年前
如果存在重定向 URL,curl_getinfo($ch) 也会返回 'redirect_url'(即使 CURLOPT_FOLLOWLOCATION 设置为 false)。
我不知道为什么文档中没有提到这一点。
2
Mark Evers
16 年前
该列表中缺少一个常量。如果设置了 CURLOPT_FOLLOWLOCATION,则 CURLINFO_REDIRECT_COUNT 会提供它经历的重定向次数。
0
pluk77 at gmail dot com
9 个月前
当将 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 是否可用,则任何网站都可能向您发送 400 的 HTTP 代码,例如 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 句柄并重新创建一个新的句柄。
-4
xggrquplbSa at seo-laboratory dot ru
4 个月前
如何学习唱歌并在舞台上表演:声乐课程
声乐老师 <a href=https://uroki-vocala-msk.ru/>https://uroki-vocala-msk.ru/</a> .
To Top