Php 什么会导致checkdnsrr()或dns_get_record()花费太长时间? “;//删除注释以查看挖掘输出 返回$lookup; } //为了确定域是否为真域,这将检查MX、a和CNAME //如果没有找到,则返回FALSE。如果三者中只有一个存在,则返回FALSE //怀疑的好处。 // //$要调查的主机域 // 函数具有有效的dns($host) { $result=dig\u get\u dns\u记录(“MX”,$host); $result.=dig\u get\u dns\u记录(“A”,$host); $result.=dig_get_dns_记录(“CNAME”,$host); 返回strpos($result,“ANSWER SECTION:”)>0; }

Php 什么会导致checkdnsrr()或dns_get_record()花费太长时间? “;//删除注释以查看挖掘输出 返回$lookup; } //为了确定域是否为真域,这将检查MX、a和CNAME //如果没有找到,则返回FALSE。如果三者中只有一个存在,则返回FALSE //怀疑的好处。 // //$要调查的主机域 // 函数具有有效的dns($host) { $result=dig\u get\u dns\u记录(“MX”,$host); $result.=dig\u get\u dns\u记录(“A”,$host); $result.=dig_get_dns_记录(“CNAME”,$host); 返回strpos($result,“ANSWER SECTION:”)>0; },php,dns,Php,Dns,虽然这会让我摆脱困境,但这并不是一个答案。我确信真正的问题是Linux服务器上的配置设置 如果您对测试延迟感兴趣,这里有一个带有一些测试的页面(网站中的表单现在正遭受延迟——请不要弄乱表单,除非您真的只是想注册): 编辑:链接已删除,因为它不再相关,页面将被删除 测试建议: apple.com apple.commmmmmmmmmm example.com asdfasdfasdf NB AndreKR的回答让我用一个拖尾周期来测试这些函数,仅此一项就将响应时间从几十秒缩短到了毫秒 这解决了问

虽然这会让我摆脱困境,但这并不是一个答案。我确信真正的问题是Linux服务器上的配置设置

如果您对测试延迟感兴趣,这里有一个带有一些测试的页面(网站中的表单现在正遭受延迟——请不要弄乱表单,除非您真的只是想注册):

编辑:链接已删除,因为它不再相关,页面将被删除

测试建议:

apple.com
apple.commmmmmmmmmm
example.com
asdfasdfasdf
NB

AndreKR的回答让我用一个拖尾周期来测试这些函数,仅此一项就将响应时间从几十秒缩短到了毫秒

这解决了问题,但并没有真正回答新的问题:为什么?为了完整性,我认为添加此注释并根据我的研究回答该问题很重要

我回到了原始资料,阅读了大部分和

事实证明,就DNS而言,完全限定域名(FQDN)实际上以句点结束。大多数对FQDN的引用都没有解释DNS具有绝对和相对域名的概念。DNS区分它们的方式正是通过这个尾随句点

如果DNS解析程序看到DNS样式的FQDN(带尾随句点),它将退出并查找该DNS FQDN的请求记录(绝对域名规范)。这可能需要几次重试。例如,如果您正在查找FQDN记录中不存在的MX记录,则可能存在CNAME。DNS解析程序将获取CNAME并启动新的DNS查询以尝试查找MX记录

如果DNS解析程序遇到相对域名规范,会发生什么情况?换句话说,任何不带尾随句点的内容。例如:“测试”。DNS解析程序实际上会尝试通过向提供的相对域名附加一系列DNS后缀来将其转换为绝对FQDN。例如:

@dns_get_record("abceabce.gov", DNS_MX);  // No trailing period === relative
如果在主机上运行,例如,
www.example.com
将至少生成以下查询集:

@dns_get_record("abceabce.gov.www.example.com", DNS_MX);
@dns_get_record("abceabce.gov.example.com", DNS_MX);
@dns_get_record("abceabce.gov.com", DNS_MX);
每一个都可能失败,整个过程将永远持续下去

事实证明,整个过程实际上都包含在RFC中。值得一读。

显然没有超时,而
dig
的默认超时是(经过多次尝试)

此外,您的开发和生产服务器可能会使用不同的DNS服务器来解析名称。现在,一些DNS服务器会为无效域发送空答案,而一些类似的服务器则根本不发送任何答案(根据规范,这很好)


还要注意,您应该包括最后的
(dot)如果您不想从resolv.conf/Windows网络设置中添加潜在的搜索域,则在域名中添加,如果这些域具有通配符,则可能始终可以解析。

您是否尝试过在php之外进行dns查找?使用
dig
?速度是否很慢?@Michael:刚刚完成一些测试。
dig
返回pret我很快就安装了PHP,结果很好。我不知道该从哪里开始。我重新安装了PHP,以防出现问题。没有变化。在实时服务器上运行PHP5.4.10,在测试服务器上运行PHP5.4.7(XAMPP)。在处理POST或GET请求时,我不会做这种不重要的网络工作。最好立即将任何内容存储在文件或数据库中,给用户一个响应,然后在后台处理。您是指测试页面还是更多的一般性声明?如果用户输入了潜在的错误,我需要立即告诉用户有效的电子邮件地址,以便给他们编辑它的机会。例如,有人可能在其他真实注册中错误地键入
.comm
。我不知道如何使用
@dns\u get\u record()
在后台,当函数需要20到30秒才能返回时,仍能提供良好的反馈。@martin's:您可以稍后通过电子邮件向用户发送结果;)不过,认真地说,发送电子邮件验证链接可能更好。即使域有效,也不意味着电子邮件地址无效或用户有访问权限哇。你说得对。我知道PHP DNS函数没有超时。事实上,今天早些时候,我在翻阅PHP源代码,试图了解使用超时版本需要什么。我不确定你是否有意这样做,但你建议在域名中添加最后一个句号产生了巨大的影响(请看我贴的测试页面)。即使是像“abcdabcd”这样的垃圾域名"时间从28秒变为3毫秒!现在我想知道为什么。我是否应该就这个主题发布一个单独的问题?至少这可能超出了这个问题的范围,但我认为在不知道您的设置/您提供了网络转储的情况下,这样的问题是无法回答的。我编辑了问题的结尾以反映我的研究在理解这个问题时,我希望它能帮助其他人避免一天的拉扯。
@dns_get_record("abceabce.gov", DNS_MX);  // No trailing period === relative
@dns_get_record("abceabce.gov.www.example.com", DNS_MX);
@dns_get_record("abceabce.gov.example.com", DNS_MX);
@dns_get_record("abceabce.gov.com", DNS_MX);