2012-07-26 21 views
20

Windows 7, Apache 2, PHP 5, MySQL 5 kullanıyorum, hepsi aynı makinede.mysql_connect (localhost/127.0.0.1) Windows platformunda yavaş çalışıyor

$sql = "select * from user1"; 
    $conn = mysql_connect("localhost", "root", "xxxxxxxx"); 
    mysql_select_db("test1"); 
    mysql_query("set names utf8"); 
    $result = mysql_query($sql, $conn); 
    while ($row = mysql_fetch_assoc($result)){ 
     foreach ($row as $key => $value){ 
      echo $key." => ".$value." || "; 
     } 
     echo "<br/>"; 
    } 
    mysql_free_result($result); 
    mysql_close($conn); 

yukarıdaki kodu için çalışma süresi olan ikinci 1 üzerinde: Ben ilginç bir konuyu bulduk, Aşağıdaki kod var.

localhost yerine 127.0.0.1 kullanıldığında, çalışma süresi 10 ms civarındadır.

internette altta yatan nedeni bulmaya çalıştılar ve bu sonucudur: Geçenlerde Windows 7'ye XP'den benim gelişimini taşındı ve ben geliştirdikleri web sayfalarını uzun 5 saniye götürüyorlardı bulundu

yük. Bu elbette kabul edilemez oldu, bu yüzden sorunu takip etmek zorunda kaldım. Sonunda, hatalı işlev/yöntem pdo :: yapısını izledim. Ayrıca mysql_connect'in bağlantı kurmak için yaklaşık 1 saniye sürdüğünü öğrendim. Küçük bir müdahalenin ardından php'nin IPv6 ile ilgili sorunları olduğunu ve IPv6'yı devre dışı bırakarak veya bağlantınızı yaparken ipadresi 127.0.0.1'e geçerek sorunu çözebileceğinizi anladım.

PHP'de IPv6'nın ne olduğunu merak ediyorum, sadece daha derin bir anlamaya çalışmak istiyorum. Teşekkürler.

+0

mysql server :: 1 çalışıyor mu? Eğer php muhtemelen ipv6 ile bağlanmayı deneyecektir ve eğer başarısız olursa ipv4'e geri dönecektir. Bu biraz daha uzun sürmeli. – konqi

+1

Üzgünüz, "mysql sunucunuzda çalışmakta olan :: 1 nedir?" anlamına geliyor? Aynı makinede birkaç mysql sunucusunun çalıştırılması anlamına mı geliyor? –

+0

Bu soru için teşekkürler. Web sitemi, localhost yerine 127.0.0.1 kullanarak muazzam bir şekilde hızlandırdım. –

cevap

27

PHP, localhost'a bir bağlantı açmaya çalışıyor. Bilgisayarınız IPv6 üzerinden ağa bağlandığında Çünkü :: 1

http://en.wikipedia.org/wiki/IPv6_address#Special_addresses

:: 1/128 bir IP adresi olan ilk 'localhost' IPv6 sürümünü çalışıyor - loopback adresi bir unicast localhost adresidir. Bir ana bilgisayarda bir uygulaması, bu adrese paketleri gönderirse, IPv6 yığını , bu paketleri aynı sanal arabirimde yeniden (IPv4'te 127.0.0.0/8'e karşılık gelir) döngüden geçirir. MySQL sunucusu yerine sadece IPv4 adreslerini kaçınılmazdır ve bu yüzden PHP geri düşüyor bağlantıyı açmak için başarısız olur ve IPv4 üzerinden aka 127.0 localhost'u açmaya çalışırsa kez bu adrese dinlemiyor gibi

görünüyor. 0.1

Ben şahsen IP adreslerini veya Windows hangi çözmek IP adreslerine, MySQL bağlanırken bu kullanmak ardından 'sahte' alan adlarını tanımlamak ve dosyayı veya Mac eşdeğer barındıran kullanımı eter ya kullanmayı tercih ediyorum. Her iki durumda da bir IPv4 veya IPv6 adresinin kullanılıp kullanılamayacağını tam olarak biliyorum.

MySQL ve Apache destek IPv6 Hem ama açıkça bir IPv6 adresi kullanmak için bunları söylemek zorundayım. MySQL için bkz: Apache yapılandırmasına için http://dev.mysql.com/doc/refman/5.5/en/ipv6-server-config.html

bkz: Aynı anda hem kullanabilmesi http://httpd.apache.org/docs/2.2/bind.html

Apaçi birden fazla IP adreslerini destekler - makinede ağ kartı IPv4 ve IPv6 adresinin ikisini varsa. MySQL sadece bir adresi destekler.Barındırıcınıza olarak

1):

+0

Soruna bakmak için bazı adımlar attım. Önce windows host dosyasına bakmak için C:/Windows/System32/drivers/etc/dizinine gittim ve içerideki tüm bilgilerin yorumlandığını gördüm. Bu yüzden "127.0.0.1 localhost" un uncommented ve mysql connetion'u çalıştırdım. Uygulama süresi yaklaşık 10 ms'dir. Sonra ana dosyaya geri döndüm, "127.0.0.1 localhost" ve uncommented ":: 1 localhost" yorumunu yaptım. Bundan sonra programı tekrar çalıştırdım. Sonuç olarak, program mysql sunucusuna bağlantı kuramadı. –

+0

Mysql sunucusunun sürümü 5.1.03'tür. Bu nedenle, sorunun muhtemelen Mysql sunucusu tarafından ipv6 desteği eksikliğinden kaynaklanabileceği sonucuna varıyorum. Bu yüzden çözümler ipv6'yı kullanmaktan veya MySQL server ipv6 desteğini etkinleştirmekten kaçınıyor olabilir. Herhangi bir öneri ve tamamlayıcı karşılandı. –

+0

"netstat -an" yi cmd ile kullanıyorum ve iki satır olduğunu görüyorum: "TCP 0.0.0.0:80 0.0.0.0:0 DİNLEME" ve "TCP 0.0.0.0:3306 0.0.0.0:0 DİNLEME". Ancak [::]: 80 veya [::]: 3306 yoktur. Bu, hem apache hem de mysql'in ipv6'yı desteklememesi anlamına mı geliyor? –

10

PHP "localhost", Windows 7/8/10 o :: 1 olmakla MySQL IPv6 soketleri dinlemiyor, birkaç düzeltmeleri uygulayabilirsiniz bağlanmaya çalışıyor dosyası (C:/windows/system32/drivers/etc/host) set localhost,

2) PHP localhost'tan MySQL sunucu değişikliği my.ini olarak

3) 127.0.0.1 için 127.0.0.1 için ekleyin ya da ekleyin: bind-address = ::

adres ::. sunucu, tüm sunucu ana bilgisayarı IPv4 ve IPv6 arabirimlerinde TCP/IP bağlantılarını kabul eder. Tüm sunucu arayüzlerinde hem IPv4 hem de IPv6 bağlantılarına izin vermek için bu adresi kullanın. Eğer varsa

seçeneği Önerilen MySQL> = 5.5.3

+1

bind-address = :: bana yardım etti! –

+0

Seçenek 1, Windows 7 ve sonraki sürümlerde çalışmaz. – marcovtwout

+0

@marcovtwout Hangi MySQL sürümü? Hangi hatayı aldın? –

İlgili konular