我在 Windows 上的 PHP 脚本执行时间上遇到了一些问题(使用 Plesk Panel 12 的 IIS 8.5 上的 PHP 5.5.14)。当我的 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 只需要几毫秒?
最佳答案
似乎在使用主机名时,首先解析 IPv6 AAAA 记录,PHPMailer 正在尝试连接到该记录。一旦失败,它将连接到 IPv4 地址。
关于使用外部主机名时 PHP 响应缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27696043/