【发布时间】:2015-02-26 01:30:27
【问题描述】:
我在 Windows 上的 PHP 中的脚本执行时间存在一些问题(IIS 8.5 上的 PHP 5.5.14 使用 Plesk Panel 12)。当我的 PHP 脚本需要连接到外部资源(邮件服务器、社交媒体 API 等)时,这需要几秒钟,这太长了。仅当我使用主机名(例如 smtp.gmail.com)时才会出现此问题。当我使用该服务器的 IP 地址时,脚本只需几毫秒即可加载。因此,问题似乎出在 DNS 解析中。
我发现了这个关于DNS Lookup in PHP 的帖子,所以我用 PHPMailer 尝试了以下操作:
- 使用邮件服务器的主机名作为主机(慢)
- 使用邮件服务器的 IP 地址作为主机(快!)
- 让 PHP 进行 DNS 查找,然后使用该 IP 地址作为主机(快!):
奇怪的是,第三种方法只适用于 IPv4 地址:
$result = dns_get_record("<hostname of mailserver>");
foreach($result as $output):
if($output['type'] == 'A'):
$ip = $output['ip'];
endif;
endforeach;
....
$mailer->Host = $ip;
....
当我尝试为该服务器使用 IPv6(完美解析)时,PHPMailer 说它无法连接到服务器。
$result = dns_get_record("<hostname of mailserver>");
foreach($result as $output):
if($output['type'] == 'AAAA'):
$ip = $output['ipv6'];
endif;
endforeach;
....
$mailer->Host = $ip;
....
当然,第一种方法(仅使用服务器的主机名)是首选方法,因为像 Google 这样的服务有很多不断变化的 IP 地址。为什么这种方法需要几秒钟才能执行,而先进行 DNS 查找,然后使用该 IP 只需要几毫秒?
【问题讨论】:
-
什么是
print_r($result); -
@AbraCadaver 当然每个主机名都不同,但我认为将我的邮件服务器的主机名和 IP 放在这里不是一个好主意。 $result 是这样的数组: Array ( [0] => Array ( [host] => pair2.php.net [type] => A [ip] => 216.92.131.5 [class] => IN [ttl] => 6766 ) )
-
这就是我的意思,如果没有
[type] => AAAA也没有[ipv6] -
@AbraCadaver 主机名有 AAAA 记录,但 Ben 的反应正是出了问题。