9

我在 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
4

3 回答 3

17

问题是我的机器上的 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);
于 2013-07-23T16:46:15.680 回答
2

在macos 上PHP 7.1.32安装后,我就遇到了这个问题。并且不要使用相同的 DNS。brewfile_get_contentscurl

就像@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'));

顺便说一句,强制使用 IP 而不是依赖解析器可能会更好。

于 2019-09-20T10:51:51.970 回答
-1

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

$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);
于 2014-02-25T04:47:46.510 回答