PHP';s cURL突然无法获得IP地址,文件内容是否是一个很好的替代品?

PHP';s cURL突然无法获得IP地址,文件内容是否是一个很好的替代品?,php,dns,Php,Dns,我们的站点上有一个页面,它使用cURL从远程域获取XML数据。几天前,它随机开始失败(可能有1/3的请求失败)。在与主机和远程站点的操作员进行调试后,我们发现curl错误为“名称查找超时”,表明存在DNS问题。我们的CURLOPT_CONNECTTIMEOUT设置为5。当我把它改为30时,每次都有效 但这是一个实时页面,我不能让访问者在等待回复时挂起30秒。另外,增加的超时时间并不能回答为什么一开始就失败的问题。该系统在安装之前已有多年,5秒的超时时间总是可以的 此外,我发现如果我做一个dns\

我们的站点上有一个页面,它使用cURL从远程域获取XML数据。几天前,它随机开始失败(可能有1/3的请求失败)。在与主机和远程站点的操作员进行调试后,我们发现curl错误为“名称查找超时”,表明存在DNS问题。我们的
CURLOPT_CONNECTTIMEOUT
设置为5。当我把它改为30时,每次都有效

但这是一个实时页面,我不能让访问者在等待回复时挂起30秒。另外,增加的超时时间并不能回答为什么一开始就失败的问题。该系统在安装之前已有多年,5秒的超时时间总是可以的

此外,我发现如果我做一个
dns\u get\u record()
,它每次都能工作,我很快就能得到一个有效的IP地址。因此,我修改了脚本,首先执行一个
dns\u get\u record()
,然后我将cURL转换为它返回的IP,这将绕过cURL末尾的名称查找。它工作得很好,但很傻

那么第一个问题,有没有人对旋度如何或为什么会失败有什么建议。我们的主机和远程站点的主机都同意它是某个DNS服务器,但都不同意由谁的DNS服务器负责,因为它们都说自己的服务器很好,并且我们的主机说它们可以ping远程域而没有问题


第二个问题,
file\u get\u contents()
是否足以替代
dns\u get\u record()
+cURL?或者我应该坚持使用
dns\u get\u record()
+cURL吗?

在引擎盖下,
cURL\u exec
file\u get\u contents
执行几乎相同的操作;它们都使用
libresolv
来:

  • 连接到名称服务器
  • 发出dns请求
  • 处理dns响应
  • 为了进一步调试,您可以使用获取有关请求的详细统计信息;您可以使用以下信息了解每个零件所用的时间:

    • 卷发信息\u姓名查找\u时间
    • CURLINFO\u连接\u时间
    • 预转移时间

    如果故意设置远程服务器,则即使将其切换到文件获取内容,也无法控制故障。您调用远程服务器的速度是否比您正常调用的速度快得多?@mauris No,每次点击此页面时只需要一个请求。这是一个受欢迎的页面,因此可能会经常访问,但每次访问都是独立的。还要注意,dns_get_record()总是成功的,所以它在获取IP地址方面的工作方式可能与cURL不同?如果是这样的话,也许file_get_contents()的工作原理与此类似?如果服务器需要更多时间,请升级远程服务器以加快速度,或者使用AJAX@mauris是的,但我认为不仅仅是DNS服务器需要更多的时间。故障开始突然发生,这不像是一个渐进的构建,这意味着随着时间的推移,构建的流量会使服务器过载。也许DNS服务器上发生了一些不好的事情,但问题仍然存在——哪个服务器,它发生了什么?另一件奇怪的事情是dns_get_record()没有超时问题,它几乎立即返回IP地址。现在需要额外时间的只是cURL。可能一个简单而快速的修复方法是将远程域的dns设置写入服务器的hosts文件中,只有在您确定远程域的ip地址不会更改的情况下,这才有效。