php实现dns
使用 PHP 实现 DNS 查询
PHP 提供了多种方式实现 DNS 查询功能,包括内置函数和第三方库。以下是几种常见的方法:
内置函数 gethostbyname 和 gethostbynamel
$ip = gethostbyname('example.com'); // 返回单个 IP 地址
$ips = gethostbynamel('example.com'); // 返回所有 IP 地址数组
使用 dns_get_record 获取详细 DNS 记录
$records = dns_get_record('example.com', DNS_A | DNS_MX);
// DNS_A 查询 A 记录,DNS_MX 查询 MX 记录
print_r($records);
通过 checkdnsrr 检查记录是否存在

if (checkdnsrr('example.com', 'MX')) {
echo 'MX 记录存在';
}
使用 getmxrr 获取 MX 记录
getmxrr('example.com', $mxhosts, $weight);
print_r($mxhosts); // 输出 MX 主机数组
print_r($weight); // 输出权重数组
使用第三方库进行高级 DNS 查询
对于更复杂的 DNS 操作,可以安装 pecl 扩展或使用第三方库:

安装 pecl/net_DNS2 扩展
pecl install net_DNS2
使用 Net_DNS2 进行查询
require_once 'Net/DNS2.php';
$r = new Net_DNS2_Resolver(array('nameservers' => array('8.8.8.8')));
$result = $r->query('example.com', 'ANY');
print_r($result);
异步 DNS 查询实现
PHP 7.1+ 支持通过 sockets 扩展实现异步 DNS 查询:
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_set_nonblock($socket);
socket_sendto($socket, $dnsPacket, strlen($dnsPacket), 0, '8.8.8.8', 53);
// 通过事件循环处理异步响应
注意事项
- 确保 PHP 安装时启用了
sockets扩展(php.ini中extension=sockets) - 防火墙需允许 UDP 53 端口的外发请求
- 大量查询时建议使用持久化连接或连接池
- 考虑缓存 DNS 结果以减少查询次数
以上方法覆盖了从简单到复杂的 DNS 查询需求,可根据实际场景选择合适方案。






