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
相关产品推荐
相关产品推荐

