2013-07-23 11 views
5

çözmek için 15s alarak cURL ve herhangi cURL isteği sürekli çalışmasına 15s alır:PHP sürekli DNS ben MacOS X altında bir CentOS sanal makine üzerinde PHP çalıştırıyorum

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

Ancak gethostbyname() çok hızlı:

Ve ping adında hemen hemen adı da giderir. Varsayılan olarak

, /etc/resolv.conf sadece içinde nameserver 192.168.1.1 vardı, bu yüzden Google DNS sunucularını kullanmak değiştirdi:

nameserver 8.8.8.8 
nameserver 8.8.4.4 

Ama hiç şansım. Herhangi bir ipucu?


Güncelleme 1: Düzeltmeler aşağıdaki sorun: Yani bildiğim kadarıyla anladığım kadarıyla

curl_setopt($curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); 

, bir zaman aşımından sonra, IPv4 ve IPv6 ve IPv6 çözünürlük hem çözümlemeye başarısız çalışıyor 15'li.

Linux makinesinde yanlış yapılandırma nedeniyle mi?


Güncelleme 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

Eğer ('https://66.220.152.19') 'curl_init yaparsak ne kadar sürer;' –

+0

bir paket yakalama yapmak ve bu cURL doğru bu bildiriyor doğrulayabilir misiniz? – Barmar

+0

@Alex IP adresiyle denedim ve çok hızlı. 'CURLINFO_NAMELOOKUP_TIME' tarafından vurgulandığı gibi kesinlikle bir DNS sorunu. – Benjamin

cevap

13

sorun benim makinede başarısız bir IPv6 arama oldu. Çözüm:

Değişti /etc/resolv.conf için:

PEERDNS=no 

Ve her şey: resolv.conf üzerine yazıldığı

nameserver 8.8.8.8 
nameserver 8.8.4.4 

, yeniden başlatmadan sonra, yani /etc/sysconfig/network-scripts/ifcfg-eth0 için bu hattı (BOOTPROTO=dhcp kullanıyordum olan) ekleyerek sorunu giderilmiştir şimdi bir çekicilik gibi çalışır. Eğer yapılandırmayı değiştiremezsiniz hangi bir sunucuda bu sorunu yaşarsanız

alternatif olarak

, kıvrılıp bu şekilde yapılandırın:

curl_setopt($curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); 
-2

sisteminizde yanlış bir şey olabilir, ama bulmak etrafında çalışmak için bir yol.

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

Erm ... 1/DNS problemi makineliydi, bu yüzden gethostbyname() işlevi kullanılmayacak; 2/host'un IP ile değiştirilmesi büyük olasılıkla bugün web sitelerinin çoğunda isim tabanlı sanal konaklar kullandığı için başarısızlığa mahkumdur; 3/Sorunun sebebini çoktan buldum, yukarıda açıkladım ve çözümü yayınladım; Sebebin ne olduğundan emin değil misin? Alınma ama ... ;-) – Benjamin

+0

@Benjamin Evet haklısınız. Her ne kadar benim tarafımdan çalışıyor olsa da, doğru bir yol değil. 1/gethostbyname() benim tarafımda çalışıyor çünkü benim DNS problemim PHP'nin kıvrılmasından kaynaklanıyor. 2/dediğiniz gibi, bugün çoğu web sitesi isim tabanlı sanal konaklar kullanır, bu yüzden çoğu web sitesinde çalışmayacaktır. – schumyxp