3

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

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

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

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

第二个问题,是+ cURLfile_get_contents()的充分替代品吗?dns_get_record()或者我应该坚持使用dns_get_record()+ cURL 吗?

4

1 回答 1

2

在引擎盖下,两者都curl_exec执行file_get_contents几乎相同的操作;他们都习惯于libresolv

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

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

  • CURLINFO_NAMELOOKUP_TIME
  • CURLINFO_CONNECT_TIME
  • CURLINFO_PRETRANSFER_TIME
  • ...
于 2012-06-22T02:10:16.233 回答