我正在使用PHP curl_multi()来抓取网站。由于此处概述的Libcurl中的同步DNS问题(https://stackoverflow.com/a/2315290/4391251),处理整个批处理时出现'卷曲错误:6:无法解析主机名:名称查找超时'当其中一个URL无法及时解析其DNS时。不幸的是,我无法使用c-ares编译Libcurl以使DNS请求变为异步。
有没有其他已知的解决方案可以解决这个问题?也许我可以使用一些异乎寻常的PHP超时来阻止一次超时的DNS解析导致所有以下DNS请求也超时?
如果没有,那么如何伪造/模拟不能解析其DNS的URL?现在我只是一次运行大批URL,希望无法解决,以便我可以测试解决方案,显然/由于DNS缓存显然不能很好地工作。
CURLOPT_CONNECTTIMEOUT,CURLOPT_DNS_CACHE_TIMEOUT或CURLOPT_IPRESOLVE等设置是否有助于解决/最小化此问题?到目前为止,这些似乎对我都没有任何影响。
提前致谢!
答案 0 :(得分:2)
首先,您链接到的旧答案只是部分正确。 (我是libcurl的主要作者,我已经写了我们在这里谈论的大部分代码。)
其次,Linux发行版和Windows上的大多数libcurls都是使用线程解析器构建的,它处理异步名称解析得很好。
但要回答实际问题:您可以通过不使用主机名来完全避免DNS解析。直接使用IP地址。您可以使用CURLOPT_RESOLVE
为您要使用的主机名提供这些IP地址。它不会看起来不错,但它应该有用。