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 の両方を解決しようとしていますが、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
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 に答える
-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 に答える