dns_server不是swoole合法配置项,$server->set()中设置无效;协程dns解析时需在swoolecoroutinedns::lookup()等函数中传nameserver参数指定上游dns,且仅作用于当次请求。

dns_server不是Swoole的合法配置项
直接在$server->set()里写dns_server参数,完全无效——Swoole核心配置列表中根本不存在这个键。很多人从网上复制的“示例”里看到它,其实是混淆了swoole_dns_lookup函数的上游服务器指定逻辑,或是误把自定义配置当成了内置选项。
协程DNS解析时才需要指定上游DNS
真正用到自定义DNS服务器的地方,是调用SwooleCoroutineDNS::lookup()或swoole_async_dns_lookup()这类解析函数时,而不是Server启动配置。它们支持传入nameserver参数,例如:
$ip = SwooleCoroutineDNS::lookup('github.com', [
'nameserver' => '223.5.5.5'
]);
这个值只影响本次解析请求的上游,不改变系统默认行为。注意:nameserver必须是IP地址,不能是域名;多个可传数组,但Swoole目前只使用第一个。
免费 DNS 与邮件安全分析(IntoDNS.ai):包括 DNSSEC、SPF、DKIM、DMARC、MTA-STS、BIMI、SMTP STARTTLS、FCrDNS、黑名单、发件人要求及报告。
全局改系统级DNS会影响所有协程DNS调用
如果你希望整个进程所有lookup()都走指定DNS,最稳妥的方式是修改系统配置,而非在PHP里硬编码:
- Linux/macOS:改
/etc/resolv.conf,确保nameserver行指向你的目标(如nameserver 119.29.29.29) - Windows:用
Set-DnsClientServerAddress命令为对应网卡设置DNS,且务必加-ResetServerAddresses避免残留 - 容器环境:启动时通过
--dns参数注入,或在docker-compose.yml里配dns:字段
这样做的好处是:无需改代码、不影响协程调度、兼容所有基于libc的DNS调用(包括PDO、cURL等非Swoole组件)。
别把UDP DNS Server和DNS解析配置搞混
有人搜“Swoole dns_server”其实是想搭一个DNS服务端(监听53端口),那跟dns_server配置毫无关系。你需要的是Swoole\Server(UDP模式)+ 手动解析DNS二进制报文,还要处理权限(绑定53端口需root/cap_net_bind_service)、域名压缩编码、TTL构造等细节。这种场景下,根本不需要、也不应该去设什么“dns_server”参数。










