ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

libcurl CURLINFO_REDIRECT_TIME 详解:跨多次重定向的总耗时如何度量、获取与使用

libcurl CURLINFO_REDIRECT_TIME 详解:跨多次重定向的总耗时如何度量、获取与使用 libcurl CURLINFO_REDIRECT_TIME 详解跨多次重定向的总耗时如何度量、获取与使用【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curl本篇围绕 libcurl 的CURLINFO_REDIRECT_TIME选项展开它回答一次带 HTTP 重定向的请求从发起到最后一次传输开始中间所有重定向步骤共花掉了多少时间。读完本文你能掌握该选项的调用方式、返回值语义与精度细节能理解 libcurl 内部在何处、以何种机制累计这段耗时并能把该指标接入自己的性能统计或 curl 命令行的-w输出格式中。一、选项定义与核心语义CURLINFO_REDIRECT_TIME是curl_easy_getinfo()的一个查询项用于获取所有重定向步骤的总耗时。官方 man 页CURLINFO_REDIRECT_TIME给出的原型如下#include curl/curl.h CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_REDIRECT_TIME, double *timep);其核心定义继承自原文档 DESCRIPTION 小节是传入一个double指针即可收到以秒为单位的总耗时该耗时覆盖了所有重定向步骤中涉及的 name lookup域名解析、connect连接建立、pretransfer传输前准备和 transfer传输部分直到最终一次传输final transaction开始为止。CURLINFO_REDIRECT_TIME包含多次重定向的完整执行时间。补充几个关键事实属性值依据枚举值CURLINFO_REDIRECT_TIME CURLINFO_DOUBLE 19include/curl/curl.h#L2969返回类型CURLINFO_DOUBLE类型即double *include/curl/curl.h#L2919-L2927单位秒double原文档 SYNOPSIS加入版本7.9.7原文档 front-matterAdded-in适用协议HTTP原文档 front-matterProtocol无重定向时的取值0零curl_easy_getinfoThis is zero if no redirection took place.也就是说该指标只对发生重定向的场景有意义如果整个请求从头到尾没有 3xx 跳转取到的值就是 0如果发生了多次跳转如A → B → C它给出的是从操作开始到C上最终传输开始为止的累计时间。二、源码机制重定向时间在哪里被打点从源码结构看CURLINFO_REDIRECT_TIME的数值来自struct Progress中的startredirect_us字段定义于 lib/urldata.h#L450其注释写得很直白timediff_t startredirect_us; /* since start when last redirected */打点位置HTTP 跟随重定向的瞬间在 lib/http.c#L1410HTTP 协议处理到 3xx 响应、确认要跟随Location头跳转到新 URL 的位置同一段代码还在处理 304/305 等分支与上传数据 rewind 校验libcurl 会调用Curl_pgrsTime(data, TIMER_REDIRECT); Curl_pgrsResetTransferSizes(data);TIMER_REDIRECT是 libcurl 进度/计时器枚举timerid的成员之一见 lib/progress.h#L41。赋值逻辑绝对耗时而非分段累加Curl_pgrsTime()会取当前时间并转发给Curl_pgrsTimeWas()后者在TIMER_REDIRECT分支中的处理位于 lib/progress.c#L321-L327case TIMER_REDIRECT: >case CURLINFO_REDIRECT_TIME: *param_doublep DOUBLE_SECS(data-progress.delta.startredirect_us); break;见 lib/getinfo.c#L545-L546。其中DOUBLE_SECS宏定义为lib/getinfo.c#L374#define DOUBLE_SECS(x) ((double)(x) / 1000000)即内部一切计时均以微秒存储返回double时统一除以 1e6 换算成秒。微秒版CURLINFO_REDIRECT_TIME_T对于更高精度的需求7.61.0 起提供了 64 位整数版本 CURLINFO_REDIRECT_TIME_T直接以微秒返回CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_REDIRECT_TIME_T, curl_off_t *timep);其取值路径在 lib/getinfo.c#L456-L457把原始微秒值直接赋给curl_off_t不经过double转换case CURLINFO_REDIRECT_TIME_T: *param_offt >int main(void) { CURL *curl curl_easy_init(); if(curl) { CURLcode result; double redirect; curl_easy_setopt(curl, CURLOPT_URL, https://example.com); result curl_easy_perform(curl); if(result CURLE_OK) { result curl_easy_getinfo(curl, CURLINFO_REDIRECT_TIME, redirect); if(result CURLE_OK) { printf(Time: %.1f, redirect); } } /* always cleanup */ curl_easy_cleanup(curl); } }使用要点必须先让 libcurl 真正跟随重定向。默认情况下 libcurl 不跟随 3xx需要设置CURLOPT_FOLLOWLOCATION命令行对应-L/--follow见 curl_easy_setopt否则第二次请求根本不会发出CURLINFO_REDIRECT_TIME只会取到 0。类型必须匹配CURLINFO_REDIRECT_TIME要求第二参为double *若要用微秒版CURLINFO_REDIRECT_TIME_T则传curl_off_t *两者不可混用详见 CURLINFO_REDIRECT_TIME_T 中的格式化打印写法如printf(Time: % CURL_FORMAT_CURL_OFF_T .%06ld, redirect / 1000000, (long)(redirect % 1000000));。取值时机在curl_easy_perform()成功返回之后、curl_easy_cleanup()之前。如果想同时观察跳了几次、每次跳去了哪、总共花了多久可以组合原文档 See-also 中列出的相邻选项long count; char *url; double total, redirect; curl_easy_setopt(curl, CURLOPT_URL, https://example.com); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); /* 允许跟随重定向 */ if(curl_easy_perform(curl) CURLE_OK) { curl_easy_getinfo(curl, CURLINFO_REDIRECT_COUNT, count); curl_easy_getinfo(curl, CURLINFO_REDIRECT_URL, url); /* 字符串由 libcurl 持有勿 free */ curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, total); curl_easy_getinfo(curl, CURLINFO_REDIRECT_TIME, redirect); printf(redirects: %ld, next: %s, total: %.3fs, redirect: %.3fs\n, count, url, total, redirect); }其中CURLINFO_REDIRECT_COUNT跳数与CURLINFO_REDIRECT_URL未启用跟随时也能看到下一个目标地址分别见 CURLINFO_REDIRECT_COUNT 和 CURLINFO_REDIRECT_URL。五、命令行对应能力-w %{time_redirect}curl 命令行工具把同一个指标暴露为-w/--write-out变量。变量注册表在 src/tool_writeout.c#L484{ time_redirect, VAR_REDIRECT_TIME, CURLINFO_REDIRECT_TIME_T, writeTime },可见 CLI 内部走的是微秒版CURLINFO_REDIRECT_TIME_T再按writeTime格式化为秒输出。一个典型的性能观测命令curl -sSL -o /dev/null \ -w num_redirects%{num_redirects} time_total%{time_total}s time_redirect%{time_redirect}s\n \ https://example.com当目标站点存在 301/302 跳转链时time_redirect显示的就是从开始到最后一次传输发起前、所有跳转步骤累计消耗的秒数未加-L或目标无跳转时该值为 0。这对诊断重定向链导致的额外延迟多级跳转、跨地域 301 等非常直观。六、放在 TIMES 全景中理解libcurl 的耗时指标族在 curl_easy_getinfo man 页中统一概述与CURLINFO_REDIRECT_TIME直接相关的几个口径指标文档语义无重定向时CURLINFO_TOTAL_TIME(_T)CURLINFO_TOTAL_TIME整个操作总耗时CURLINFO_NAMELOOKUP_TIME(_T)CURLINFO_NAMELOOKUP_TIME最后一段域名解析耗时CURLINFO_CONNECT_TIME(_T)CURLINFO_CONNECT_TIME最后一段连接建立耗时CURLINFO_PRETRANSFER_TIME(_T)CURLINFO_PRETRANSFER_TIME从开始到最后一次传输即将开始CURLINFO_STARTTRANSFER_TIME(_T)CURLINFO_STARTTRANSFER_TIME从开始到收到第一个字节CURLINFO_REDIRECT_TIME(_T)本文所有重定向步骤总耗时无重定向为 0从源码结构看可以推断两者的配合关系带重定向时TOTAL_TIME可粗略拆成重定向阶段 最终传输阶段而time_redirect 最终传输耗时 ≈ time_total若time_redirect占比异常高通常意味着跳转链过长或某个中间站点的连接/解析很慢。七、返回值与注意事项继承原文档 RETURN VALUE 小节的说明curl_easy_getinfo()返回一个CURLcode表示成功或错误。CURLE_OK(0) 表示一切正常非零值表示发生了错误参见 libcurl-errors(3)。实践中的常见坑没有跟随重定向就取值为 0。未启用CURLOPT_FOLLOWLOCATION时3xx 后操作即结束自然不存在重定向步骤此时可用CURLINFO_REDIRECT_URL确认确实收到了跳转目标从而区分无重定向与未启用跟随。该指标仅对 HTTP 重定向有意义。原文档 front-matter 标注Protocol: HTTP打点代码也位于 HTTP 协议实现中lib/http.c#L1410其他协议的传输不涉及该打点。double 与 curl_off_t 两套口径不要混传对应不同的枚举值与取值函数lib/getinfo.c#L456-L457 与 lib/getinfo.c#L545-L546。一个实现层面的小细节在DEBUGBUILD编译版本中getinfo_double()/getinfo_offt()支持通过环境变量CURL_TIME强制覆盖返回的时间值lib/getinfo.c#L381-L404这是供测试使用的后门正式构建中不生效。八、延伸阅读原文档CURLINFO_REDIRECT_TIME man 页微秒版CURLINFO_REDIRECT_TIME_T跳数与目标地址CURLINFO_REDIRECT_COUNT、CURLINFO_REDIRECT_URL全部 getinfo 选项总览curl_easy_getinfo关键实现文件lib/getinfo.c、lib/progress.c、lib/http.c、lib/urldata.h【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表