使用外部主机名时PHP响应缓慢

时间:2014-12-29 21:09:16

标签: php windows iis dns

我在Windows上的PHP脚本的使用时间有些问题(使用Plesk Panel 12在IIS 8.5上使用PHP 5.5.14)。当我的PHP脚本需要连接到外部资源(邮件服务器,社交媒体API等)时,这需要几秒钟,这太长了。仅当我使用主机名(例如smtp.gmail.com)时才会出现此问题。当我使用该服务器的IP地址时,脚本只需几毫秒即可加载。因此,问题似乎在DNS解析中。

我找到了关于DNS Lookup in PHP的这个帖子,所以我尝试了以下PHPMailer:

  1. 使用mailserver的主机名作为主机(慢)
  2. 使用邮件服务器的IP地址作为主机(快!)
  3. 让PHP进行DNS查找,然后将该IP地址用作主机(快!):
  4. 奇怪的是第3种方法仅适用于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只需要几毫秒?

1 个答案:

答案 0 :(得分:1)

在使用主机名时,似乎首先解析了IPv6 AAAA记录,并且PHPMailer正在尝试连接到该主机名。一旦失败,它就会连接到IPv4地址。