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

标签 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. 使用邮件服务器的主机名作为主机(慢)
  2. 使用邮件服务器的 IP 地址作为主机(快!)
  3. 让 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/

相关文章:

php - 防止 SQL 注入(inject) - PDO、mysqli

php - SQL:使用联接从多个表中删除

php - 如何显示用户在 MySQL 和 PHP 中出现一次的多个结果?

windows - 我需要为 Windows 创建一个虚拟打印机驱动程序,它将通过另一个程序重定向请求

windows - metro 应用程序中的 OnLaunched 事件和恢复事件有什么区别?

c++ - 我如何在Windows上使用c++在不带<dirent.h>的情况下获取具有特定扩展名的所有文件的列表

c# - 在 IIS 7.5 中重命名默认网站是否安全?

php - 通过 php 插件命令显示背景图片

IIS7 对某些静态文件返回 404,而对其他文件则不返回

PHP 忽略 php.ini 中的 curl.cainfo 设置(显然)