我应该多次调用dns_get_record(),还是使用DNS_ANY调用一次?

时间:2014-11-14 00:08:33

标签: php

对于PHP函数dns_get_record(),使用DNS_ANY获取所有记录是否比单独调用类型产生更多或更少的http(或任何协议)请求?

// Is just 1 request? Or many requests (1 per each record type)?
dns_get_record('example.com', DNS_ANY);

VS

// 3 total requests?
dns_get_record('example.com', DNS_A);
dns_get_record('example.com', DNS_AAAA);
dns_get_record('example.com', DNS_MX); 

基本上,我想尽可能减少网络请求,但我不知道dns_get_record()是如何工作的。

由于文档说DNS_ANY并不总是返回所有记录,我想我可以尝试单独调用我想要的类型以获得更可预测的结果。但这样做会产生3个单独的请求,而不是DNS_ANY的一个请求。这是真的吗?

顺便说一句,如果任何类型为null,则DNS_ALLDNS_A + DNS_AAAA + DNS_MX将返回false,因此我不能这样做。

1 个答案:

答案 0 :(得分:1)

为每种类型单独获取信息是低效的,因为这将涉及多个请求,而将DNS_ANY参数与dns_get_record()一起使用,只需一个请求即可获取所有信息。 DNS_ANY是一个方便查询dns服务器信息的参数。使用此特定参数,您可能会获得相当多的信息。

如果您尝试在Linux命令行提示符下使用诸如“dig”之类的实用程序来获取gmail.com这样的域,您可以自己看看:

dig gmail.com ANY

输出如下:

`;; QUESTION SECTION:
;gmail.com.                     IN      ANY

;; ANSWER SECTION:
gmail.com.              2386    IN      MX      30 alt3.gmail-smtp-in.l.google.c                                                                              om.
gmail.com.              2386    IN      MX      40 alt4.gmail-smtp-in.l.google.c                                                                              om.
gmail.com.              2386    IN      MX      5 gmail-smtp-in.l.google.com.
gmail.com.              2386    IN      MX      10 alt1.gmail-smtp-in.l.google.c                                                                              om.
gmail.com.              2386    IN      MX      20 alt2.gmail-smtp-in.l.google.c                                                                              om.
gmail.com.              85186   IN      SOA     ns1.google.com. dns-admin.google                                                                              .com. 2012061200 21600 3600 1209600 300
gmail.com.              81180   IN      NS      ns3.google.com.
gmail.com.              81180   IN      NS      ns4.google.com.
gmail.com.              81180   IN      NS      ns1.google.com.
gmail.com.              81180   IN      NS      ns2.google.com.

;; AUTHORITY SECTION:
gmail.com.              81180   IN      NS      ns2.google.com.
gmail.com.              81180   IN      NS      ns3.google.com.
gmail.com.              81180   IN      NS      ns4.google.com.
gmail.com.              81180   IN      NS      ns1.google.com.

;; ADDITIONAL SECTION:
ns1.google.com.         223708  IN      A       216.239.32.10
ns2.google.com.         223708  IN      A       216.239.34.10
ns3.google.com.         223708  IN      A       216.239.36.10
ns4.google.com.         223708  IN      A       216.239.38.10

;; Query time: 4 msec
[snip] 

PHP的dns_get_record()表现得像dig实用程序,即它与dns服务器联系并执行查询。像“DNS_ANY”这样的参数是有利的,因为它可以同时获取所有内容。由于“挖掘”需要4毫秒,我认为dns_get_record()需要大约相同的时间或稍长一些。由于DNS_ANY参数可能产生的信息多于人们可能需要的信息,因此可以通过将DNS_MX与函数一起使用,将该查询限制为“MX”记录。

如果您对此函数的PHP内部源代码感到好奇,请查看here。内部源代码通常用C编程语言编写。

如果您想了解有关dns系统如何工作的更多信息,特别是在使用PHP时,请参阅我的文章for php | architect,题为“电子邮件验证”(2008年6月)。