laravel 5中curl dns缓存需通过libcurl选项控制:启用curlopt_dns_cache_timeout(如300秒)和curlopt_dns_use_global_cache,并复用guzzle client单例;系统级可部署dnsmasq实现全局dns缓存。

Laravel 5 本身不直接控制 cURL 的 DNS 缓存行为,cURL 的 DNS 缓存由底层 libcurl 库和操作系统共同决定。但 Laravel 应用中若大量使用 cURL(比如通过 Guzzle、Http Facade 或自定义 HTTP 客户端),DNS 解析慢会导致请求延迟甚至超时——尤其当目标域名频繁解析、DNS 服务器响应不稳定时。
要让 Laravel 5 中的 cURL 请求具备 DNS 缓存能力,关键不是改 Laravel 配置,而是控制 cURL 实例的选项,并配合系统级优化。
✅ 启用 cURL 内置 DNS 缓存(推荐)
libcurl 自带内存级 DNS 缓存(CURLOPT_DNS_CACHE_TIMEOUT),默认开启且缓存 60 秒。你只需确保:
- 使用的是较新版本 libcurl(≥7.26.0,Laravel 5 默认环境通常满足)
- 不主动关闭 DNS 缓存(如未设置
CURLOPT_DNS_CACHE_TIMEOUT = 0)
Guzzle 用户(最常见场景):
Guzzle 7+ 默认复用 cURL 的 DNS 缓存,但 Guzzle 6(Laravel 5 常用)需手动配置:
use GuzzleHttp\Client;
$client = new Client([
'curl' => [
CURLOPT_DNS_CACHE_TIMEOUT => 300, // 缓存 5 分钟
CURLOPT_DNS_USE_GLOBAL_CACHE => true, // 启用全局共享缓存(进程内复用)
],
]);
⚠️ 注意:CURLOPT_DNS_USE_GLOBAL_CACHE 在多线程 PHP(如 Apache prefork)中不安全,但 Laravel 5 多为 FPM 模式(单线程 per-worker),可放心启用。
✅ 复用 cURL handler(避免重复初始化)
每次新建 cURL 句柄都会重置 DNS 缓存。应复用同一个 CurlMultiHandler 或 Client 实例(如绑定为 Singleton):
基于5000余部现行法律法规进行的高质量专业合同审查,一键输出审查意见书,并附有参考法条原文,满足专业溯源核查要求。由accurLex知法提供技术支持。 Use when users ask for 合同审查, 审查意见书, 合同风险分析, 条款审查,知法,accurLex or 站在甲方/乙方角度审查合同 through accurLex direct API. China law only, plaintext only, review mode limited to 审查意见书.
// 在 service provider 中注册单例
$this->app->singleton('http.client', function ($app) {
return new Client([
'curl' => [CURLOPT_DNS_CACHE_TIMEOUT => 300],
]);
});
这样所有 HTTP 请求共享同一组 DNS 缓存条目,效果显著。
✅ 系统级辅助:本地 DNS 缓存服务
cURL 缓存是进程内、短期的;更稳的方式是让整个 PHP-FPM 进程走本地 DNS 缓存:
- Linux 下部署
dnsmasq或systemd-resolved - 将
/etc/resolv.conf中nameserver改为127.0.0.1 - 重启
dnsmasq:sudo systemctl restart dnsmasq
这样所有出站请求(包括 cURL、PDO、file_get_contents)都受益,无需改代码。
❌ 不起作用的“伪优化”
-
php artisan config:cache或cache:clear对 cURL DNS 无影响 - Laravel 的
Cache::系统不干预网络层 DNS -
DB_HOST改 IP 是针对数据库连接的优化,和 cURL 无关
✅ 快速验证是否生效
运行以下脚本两次,观察第二次是否明显更快(排除首次解析开销):
php -r "
\$ch = curl_init('https://api.example.com');
curl_setopt(\$ch, CURLOPT_NOBODY, true);
curl_setopt(\$ch, CURLOPT_DNS_CACHE_TIMEOUT, 300);
curl_exec(\$ch);
echo curl_getinfo(\$ch, CURLINFO_NAMELOOKUP_TIME), \"\n\";
curl_close(\$ch);
"
若 NAMELOOKUP_TIME 从 ~100ms 降到接近 0,则 DNS 缓存已起效。










