PHP的cURL突然无法获得IP地址,file_get_contents是一个很好的替代品


PHP's cURL suddenly failing to get an IP address, is file_get_contents a good replacement?

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

但这是一个实时页面,我不能让访问者在等待响应时挂起 30 秒。另外,增加的超时并不能回答为什么这首先开始失败的问题。该系统在几年前就已经存在了,5 秒超时总是没问题。

此外,我发现如果我做一个dns_get_record(),它每次都有效,我很快就会得到一个有效的 IP 地址。所以我修改了脚本,首先做一个dns_get_record(),然后我cURL到它返回的IP,这绕过了cURL端的名称查找。它工作正常,但它很愚蠢。

所以第一个问题,有没有人对cURL如何或为什么失败有任何建议。我们的主机和远程站点的主机都同意它是某处的 DNS 服务器,但都不同意谁的 DNS 服务器负责,因为两者都说他们自己的服务器很好,我们的主机说他们可以毫无问题地 ping 远程域。

第二个问题,file_get_contents()是否足以替代dns_get_record() + cURL?还是我应该坚持使用 dns_get_record() + cURL?

在引擎盖下,curl_execfile_get_contents 执行几乎相同的操作;它们都使用 libresolv 来:

  1. 连接到名称服务器
  2. 发出 DNS 请求
  3. 处理 DNS 响应

要进一步调试它,您可以使用curl_getinfo()来获取有关您的请求的详细统计信息;您可以使用它来了解每个部分使用的时间:

  • CURLINFO_NAMELOOKUP_TIME
  • CURLINFO_CONNECT_TIME
  • CURLINFO_PRETRANSFER_TIME