Php 解析DNS需要15秒

Php 解析DNS需要15秒,php,curl,Php,Curl,我在MacOS X下的CentOS虚拟机上运行PHP,任何cURL请求始终需要15秒才能运行: $c=curl\u init('https://graph.facebook.com'); curl_exec($c);//需要15秒才能返回。。。 echo curl_getinfo($c,CURLINFO_name lookup_TIME);//15.01秒 但是,速度非常快: echo gethostbyname('graph.facebook.com');//几乎瞬间 而且,ping几乎可

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

$c=curl\u init('https://graph.facebook.com');
curl_exec($c);//需要15秒才能返回。。。
echo curl_getinfo($c,CURLINFO_name lookup_TIME);//15.01秒
但是,速度非常快:

echo gethostbyname('graph.facebook.com');//几乎瞬间
而且,
ping
几乎可以立即解析名称

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

nameserver 8.8.8.8
nameserver 8.8.4.4
但是没有运气。有什么提示吗


更新1:以下内容修复了该问题:

PEERDNS=no
curl\u setopt($curl,CURLOPT\u IPRESOLVE,curl\u IPRESOLVE\u V4);
据我所知,它正在尝试解析IPv4和IPv6,而IPv6解析在超时15秒后失败

这是因为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
dig graph.facebook.com aaaa
;; 意外来源回复:10.0.2.2#53,预期192.168.1.1#53
;; 意外来源回复:10.0.2.2#60944,预期192.168.1.1#53
;; 意外来源回复:10.0.2.2#53,预期192.168.1.1#53
;  挖掘9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.4 graph.facebook.com aaaa
;; 全局选项:+cmd
;; 连接超时;无法访问任何服务器

问题是我的计算机上的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\u setopt($curl,CURLOPT\u IPRESOLVE,curl\u IPRESOLVE\u V4);

您的系统可能有问题,但我找到了解决办法

$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);

在macos上安装了
PHP7.1.32
brew
,我就遇到了这个问题
file\u get\u contents
curl
不使用相同的DNS

正如@schumyxp所说,您可以先手动解析:

<?php
$ip = gethostbyname("XXXXX.infra");
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://" . $ip);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Host: XXXXX.infra'));

如果执行
curl\u init('https://66.220.152.19');
你能做一个数据包捕获并确认cURL报告的是正确的吗?@Alex我已经用IP地址试过了,速度非常快。肯定是DNS问题,正如
CURLINFO\u NAMELOOKUP\u TIME
所强调的。我不确定这是为什么造成问题,我在这里查找graph.facebook.com的IPv6地址没有问题。你对dig graph.facebook.com aaaa有问题吗?你的环境中发生了一些非常奇怪的事情。你认识10.0.2.2地址吗,它是192.168.1.1的另一个地址吗?如果你做了
dig graph.facebook.com aaaa@8.8.8
,你会得到同样的回答吗。。。1/DNS问题是机器方面的,因此使用
gethostbyname()
没有帮助;2/用IP替换主机很可能会失败,因为当今大多数网站都使用基于名称的虚拟主机;3/我已经找到问题的原因,在上面解释了问题,并发布了解决方案;不确定你的动机是什么。。?无意冒犯,但…;-)@本杰明:是的,你是对的。虽然从我的角度来说是可行的,但这不是一个正确的方法。1/gethostbyname()在我这边起作用,因为我的DNS问题是由PHP的curl引起的。2/正如您所说,今天大多数网站都使用基于名称的虚拟主机,因此它在大多数网站上都不起作用。我按照您的想法修改了文件
/etc/resolv.conf
,它显示了一条消息
#该文件由man:systemd resolved(8)管理。不要编辑。
您确定可以编辑不应编辑的文件吗?@YevgeniyAfanasyev使用DHCP时看起来不安全,但在我的情况下,设置
peernds=no
会阻止文件被覆盖。谷歌“resolv.conf覆盖”,看看是否有更好的解决方案!