PHP cURL一直需要15秒才能解析DNS

时间:2013-07-23 15:45:57

标签: php curl

我在MacOS X下的CentOS虚拟机上运行PHP,并且任何cURL请求一直需要15秒才能运行:

$c = curl_init('https://graph.facebook.com');
curl_exec($c); // takes 15s to return...
echo curl_getinfo($c, CURLINFO_NAMELOOKUP_TIME); // 15.01 seconds

然而,gethostbyname()非常快:

echo gethostbyname('graph.facebook.com'); // almost instant

并且ping几乎立即解析了这个名字。

默认情况下,/etc/resolv.conf中只有nameserver 192.168.1.1,因此我将其更改为使用Google DNS服务器:

nameserver 8.8.8.8
nameserver 8.8.4.4

但没有运气。任何提示?


更新1 :以下问题解决了该问题:

curl_setopt($curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);

据我了解,它试图解决IPv4和IPv6问题,并且在15秒超时后IPv6解析失败。

由于Linux机器上的配置错误?


更新2

dig graph.facebook.com aaaa

;; reply from unexpected source: 10.0.2.2#53, expected 192.168.1.1#53
;; reply from unexpected source: 10.0.2.2#60944, expected 192.168.1.1#53
;; reply from unexpected source: 10.0.2.2#53, expected 192.168.1.1#53

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.4 <<>> graph.facebook.com aaaa
;; global options: +cmd
;; connection timed out; no servers could be reached

3 个答案:

答案 0 :(得分:14)

问题是我的计算机上的IPv6查找失败。解决方案:

/etc/resolv.conf更改为:

nameserver 8.8.8.8
nameserver 8.8.4.4

重新启动后,resolv.conf被覆盖,因此将此行添加到/etc/sysconfig/network-scripts/ifcfg-eth0(使用BOOTPROTO=dhcp)修复了问题:

PEERDNS=no

现在一切都像魅力一样。

作为替代方案,如果您在无法更改配置的服务器上遇到此问题,请以这种方式配置cURL:

curl_setopt($curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);

答案 1 :(得分:0)

在macOS上安装FindOne()的{​​{1}}时,我确实遇到了这个问题。 PHP 7.1.32brew不使用相同的DNS。

就像@schumyxp一样,您可以先手动解决:

file_get_contents

顺便说一句,强制IP而不是依赖解析器可能是个好习惯。

答案 2 :(得分:-2)

您的系统可能存在问题,但我找到了解决问题的方法。

$urldata = parse_url($yourUrl);  
$host = $urldata['host'];  
$ip = gethostbyname($host);  
$new_Url_dns_resolved = str_replace($host,$ip,$yourUrl);  
//call the dns resolved url instead of the original url  
$c = curl_init($new_Url_dns_resolved);