curl 中已废弃的 CURLOPT_DNS_USE_GLOBAL_CACHE:全局 DNS 缓存的兴衰与正确替代方案

发布时间:2026/9/10 1:23:32
curl 中已废弃的 CURLOPT_DNS_USE_GLOBAL_CACHE:全局 DNS 缓存的兴衰与正确替代方案 curl 中已废弃的 CURLOPT_DNS_USE_GLOBAL_CACHE全局 DNS 缓存的兴衰与正确替代方案【免费下载链接】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导读CURLOPT_DNS_USE_GLOBAL_CACHE是 libcurl 历史上一个用于跨 easy handle 共享 DNS 解析缓存的选项但因全局变量方案存在严重的线程安全缺陷早在 7.11.1 就被标记废弃并在 7.62.0 之后彻底失去功能。本文基于当前仓库中的官方文档 CURLOPT_DNS_USE_GLOBAL_CACHE.md 及 libcurl 源码完整梳理该选项的来龙去脉、当前实际行为并给出跨句柄共享 DNS 缓存的现代正确做法CURLOPT_SHARECURL_LOCK_DATA_DNS与CURLOPT_DNS_CACHE_TIMEOUT。读完本文你将清楚为什么不能再用它、遇到老代码该如何迁移以及 libcurl 的 DNS 缓存在现代版本中到底如何工作。选项概述名字即历史CURLOPT_DNS_USE_GLOBAL_CACHE的字面含义是启用全局 DNS 缓存当传入的enable值为 1 时libcurl 将使用一个在所有 easy handle 创建与销毁之间都能存活的全局 DNS 缓存值为 0默认则关闭。其原型如下#include curl/curl.h CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_USE_GLOBAL_CACHE, long enable);选项类型为long默认值为0关闭。它对所有协议生效Protocol: All。然而在文档的 DESCRIPTION 一节第一句话就是毫不含糊的结论Has no function since 7.62.0. Do not use.——自 7.62.0 起该选项已无任何功能官方直接建议不要使用。历史沿革从引入到彻底失效根据 symbols-in-versions 中CURLOPT_DNS_USE_GLOBAL_CACHE 7.9.3 7.11.1的版本记录以及 CURLOPT_DNS_USE_GLOBAL_CACHE.md 文档本身可以整理出这条时间线版本事件7.9.3选项引入Added-in: 7.9.3开启全局 DNS 缓存能力7.11.1被正式标记为Deprecated废弃7.62.0功能移除之后该选项对 libcurl 不再产生任何作用文档 DEPRECATED 一节完整说明了这一过程Deprecated since 7.11.1. Functionality removed in 7.62.0.废弃的根本原因在 DESCRIPTION 中写得很直白——这个方案uses a global variable使用一个全局变量并且not thread-safe线程不安全。在多线程应用里多个线程同时读写同一个全局 DNS 缓存没有任何同步保护会产生数据竞争这也是 libcurl 官方线程文档 libcurl-thread.md 第 125 行明确点名CURLOPT_DNS_USE_GLOBAL_CACHE(3)is not thread-safe的原因。源码现状一个被架空的选项虽然文档说无功能但为了兼容旧程序libcurl 并没有从 API 中移除这个选项符号而是把它变成了一个接受参数但直接忽略的空操作。在 setopt.c 的选项分发逻辑中可以看到case CURLOPT_DNS_USE_GLOBAL_CACHE: /* deprecated */ break;即当应用传入该选项时libcurl 会正常返回成功但不保存、不处理、不产生任何行为setopt.c 第 897-899 行。由于setopt_long分支正常返回应用层完全感知不到差异——这正是一种静默兼容的设计。对应的头文件定义也完整保留了符号本身。在 curl.h 中/* Non-zero value means to use the global dns cache */ /* DEPRECATED, do not use! */ CURLOPTDEPRECATED(CURLOPT_DNS_USE_GLOBAL_CACHE, CURLOPTTYPE_LONG, 91, 7.11.1, Use CURLOPT_SHARE),curl.h 第 1473-1476 行值得注意的两点宏参数中直接注明了废弃版本7.11.1以及替代指引Use CURLOPT_SHARE即官方建议改用共享句柄share handle机制在CURL_NO_OLDIES编译模式下即用户显式要求剔除老旧 API该选项会被直接取消定义#undef CURLOPT_DNS_USE_GLOBAL_CACHE /* soon obsolete */curl.h 第 2321-2323 行。此外选项元数据表中仍保留它的登记信息easyoptions.c 第 85 行写着{ DNS_USE_GLOBAL_CACHE, CURLOPT_DNS_USE_GLOBAL_CACHE, CURLOT_LONG, 0 }类型为CURLOT_LONG。这意味着curl_easy_option_by_name()之类的运行时查询接口依然能查到这个选项但查询到它并不代表它可用。参数、默认值与返回码参数类型long取 1 表示开启全局缓存取 0 表示关闭默认值0关闭返回值与所有curl_easy_setopt一样返回CURLcode。CURLE_OK0表示成功非零表示出错具体错误码参见 libcurl-errors(3)docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.md 的 RETURN VALUE 一节。由于选项已被架空在实际运行中无论传 0 还是 1都不会对 DNS 解析行为有任何影响。示例代码官方给出的用法文档 EXAMPLE 一节给出了完整的可运行示例展示了显式关闭全局缓存的写法也是现代代码中唯一合理的写法int main(void) { CURL *curl curl_easy_init(); if(curl) { CURLcode result; curl_easy_setopt(curl, CURLOPT_URL, https://example.com/); /* switch off the use of a global, thread-unsafe, cache */ curl_easy_setopt(curl, CURLOPT_DNS_USE_GLOBAL_CACHE, 0L); result curl_easy_perform(curl); curl_easy_cleanup(curl); } }值得注意的是仓库的测试套件中仍有历史用例在调用这个选项tests/libtest/lib1512.c 第 70 行对多个 easy handle 调用了easy_setopt(curl[i], CURLOPT_DNS_USE_GLOBAL_CACHE, 1L)并配合CURLOPT_RESOLVE模拟多句柄共享解析场景。这个测试本身正是该选项曾经试图解决的问题多句柄复用解析结果的活化石但因为选项已失效如今测试实际验证的是传了废弃选项也不会出错的兼容性。现代替代方案一CURLOPT_SHARE CURL_LOCK_DATA_DNS官方推荐官方在废弃该选项时给出的替代指引是CURLOPT_SHARE。这是 libcurl 提供的数据共享机制通过curl_share_init()创建一个 share handle再用CURLSHOPT_SHARE声明要共享的数据类型最后通过CURLOPT_SHARE把 share handle 挂到各个 easy handle 上。要共享 DNS 缓存声明CURL_LOCK_DATA_DNS即可详见 CURLOPT_SHARE.md 与 curl_share_setopt(3)。从源码可以确认这条路径在现代 libcurl 中是真实生效的。在 vdns/dnscache.c 中DNS 缓存的位置选择逻辑如下static struct Curl_dnscache *dnscache_get(struct Curl_easy *data) { if(data-share contenteditable="false">【免费下载链接】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),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询