PHP 没有官方维护的 php-dns Composer 包,推荐优先使用原生 dns_get_record()(依赖系统配置)或 exec() 调用 dig/nslookup(可控超时、自定义 DNS),异步场景可选 react/dns。

PHP-DNS 库(dns-packet 的 PHP 移植版)并不存在官方维护的 Composer 包;你搜到的 php-dns 多数是过时、无人维护、甚至无法在现代 PHP(8.0+)运行的项目。直接 composer require 它大概率会失败或引入严重安全/兼容性问题。
为什么找不到可用的 php-dns Composer 包
搜索 php-dns 在 Packagist 上结果极少,且主流结果如 dns-protocol/dns 或 resolv-php/resolv 并非真正“底层 DNS 查询库”,而是 DNS 协议解析器(只解包/打包 DNS 报文),不自带网络传输能力;而真正能发 UDP/TCP 查询的库(如 react/dns)又依赖事件循环,不适合同步场景。
- GitHub 上标为
php-dns的仓库大多最后更新在 2016 年前,PHP 7.4 就已报错 -
composer require php-dns/php-dns会提示 “Package not found” 或安装后调用dns_query报Fatal error: Uncaught Error: Call to undefined function - PHP 原生
dns_get_record()和gethostbyname()是最轻量、最可靠的选择——它们调用系统 libc 的getaddrinfo()或res_query(),就是底层 DNS 查询本身
用原生函数替代:dns_get_record() 的正确用法与限制
dns_get_record() 是 PHP 内置函数,无需 Composer,支持 A、AAAA、MX、TXT、CNAME 等常见类型,行为接近 dig/host,但要注意它不走自定义 DNS 服务器,完全依赖系统配置(/etc/resolv.conf 或 Windows DNS 设置)。
- 查 A 记录:
dns_get_record('example.com', DNS_A) - 查 MX + TXT 一起:
dns_get_record('gmail.com', DNS_MX | DNS_TXT) - 超时不可控——没有
$timeout参数;若系统 resolver 卡住,PHP 进程会阻塞(默认 5s,由 libc 控制) - 不支持指定 nameserver;如需发往 8.8.8.8,必须改系统配置或换方案
- 返回数组结构扁平,但部分字段(如
class、ttl)可能缺失,取决于系统 resolver 实现
需要自定义 DNS 服务器?用 react/dns(仅限异步场景)
如果你真要绕过系统 resolver、直连特定 DNS 服务器(如 1.1.1.1),且项目已用 ReactPHP 或可接受事件循环模型,react/dns 是目前唯一活跃、可靠的选项。
立即学习“PHP免费学习笔记(深入)”;
- 安装:
composer require react/dns - 基础用法(需 EventLoop):
$loop = React\EventLoop\Factory::create(); $dnsFactory = new React\Dns\Resolver\Factory(); $resolver = $dnsFactory->create('8.8.8.8:53', $loop); $resolver->resolve('github.com')->then(function ($ip) { echo $ip . "\n"; }); $loop->run(); - 不支持同步阻塞调用;强行在普通 CLI 脚本里用会卡死——必须配合
react/event-loop - 对简单脚本是杀鸡用牛刀;若只是偶尔查几个域名,不如用 shell 调
dig @8.8.8.8 example.com A +short并exec()
绕过 PHP 层:用 exec() 调用 dig / nslookup(最稳的 fallback)
当你要精确控制 DNS 服务器、协议(TCP/UDP)、超时、重试,且不能引入事件循环时,调用系统 dig 是最可控的方式。它本质就是 PHP 执行底层 DNS 查询的“外挂接口”。
- 查 A 记录并只取 IP:
exec("dig @8.8.8.8 example.com A +short", $output); $ip = $output[0] ?? null; - 加超时防卡死:
exec("timeout 3 dig @1.1.1.1 example.com AAAA +short 2>/dev/null", $output); - 注意 Windows 下用
nslookup,且语法不同;建议封装判断 OS 或统一用dig(需提前装好) - 输出需清理换行和空格;
trim(implode('', $output))比直接取$output[0]更安全 - 生产环境需验证
dig是否存在、是否被禁用(某些共享主机屏蔽 exec 函数)
真正执行底层 DNS 查询,PHP 没有“开箱即用”的纯 PHP 库能同时满足:可指定 nameserver、同步调用、兼容 PHP 8.2、无额外依赖。选原生函数还是 shell 调用,取决于你能否接受系统 resolver 的约束——这点比代码写几行更重要。



















