You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP调用dns_get_record获取TXT DNS记录无法返回新添加数据如何解决

问题排查和解决方法

1 先排查DNS解析本身的问题

  • 缓存未生效:各级递归DNS服务器都会缓存DNS记录,你设置的TTL值只是官方推荐的缓存时长,部分运营商DNS会强制延长缓存时间,最长可能达到48小时。你可以先通过命令行工具手动指定公共DNS测试记录是否已经全局生效:
    Windows系统执行 nslookup -type=TXT 你的目标域名 8.8.8.8
    Linux/Mac系统执行 dig TXT 你的目标域名 @8.8.8.8
    如果上述命令能返回你新增的TXT记录,说明是你运行PHP代码的服务器本地DNS缓存未更新,清空服务器本地DNS缓存后重试即可;如果公共DNS也查不到,说明是你的域名解析配置错误。
  • 解析配置错误:检查你添加TXT记录时的主机名配置:如果你要查根域名的TXT记录,解析面板的主机名要填@,如果你填了其他值(比如test),实际生效的是test.你的域名的TXT记录,查根域名肯定获取不到。另外检查你代码里$checkDomain的取值是否和你添加记录的域名一致,你返回的现有TXT记录host值为site,说明当前查询的是site开头的二级域名而非根域名,注意核对变量取值。

2 你的代码逻辑存在缺陷

你当前的代码只要遍历到任意一条不匹配的TXT记录就会输出false,而域名下通常会存在多条TXT记录(比如你返回的SPF记录就是其中一条),哪怕后面存在匹配的目标记录,也会因为前面输出了false导致结果错误。优化后的代码逻辑参考:

$checkDomain = "example.com";
$domainKey = "testkey";
$hasMatch = false;

$dnsArray = dns_get_record($checkDomain, DNS_TXT);
foreach ($dnsArray as $dns) {
    if ($dns['type'] == "TXT" && $dns['txt'] == $domainKey) {
        $hasMatch = true;
        break; // 匹配到就终止循环
    }
}

echo $hasMatch ? 'true' : 'false';

3 DNS_ANY报错属于正常情况

现在绝大多数公共递归DNS都禁用了ANY类型的查询,用来防范DNS放大攻击,所以调用dns_get_record时传入DNS_ANY参数返回临时服务器错误是普遍现象,直接使用DNS_TXT查询即可,无需额外处理。

内容的提问来源于stack exchange,提问作者voorbestanden athome

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:27:02