我在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
答案 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.32
和brew
不使用相同的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);