2012-07-26 46 views
20

Tôi đang sử dụng Windows 7, Apache 2, PHP 5, MySQL 5, tất cả đều nằm trên cùng một máy. Tôi đã tìm thấy một vấn đề thú vị, tôi có đoạn mã sau:mysql_connect (localhost/127.0.0.1) chạy chậm trên nền tảng Windows

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

Thời gian chạy cho đoạn code trên là hơn 1 giây.

Khi tôi sử dụng 127.0.0.1 thay vì localhost, thời gian chạy là khoảng 10 ms.

Tôi cố gắng để tìm ra nguyên nhân sâu xa trên mạng Internet, và đây là kết quả:

thời gian gần đây tôi chuyển phát triển của tôi từ XP lên Windows 7 và thấy rằng các trang web tôi đã phát triển được dùng dài đến 5 giây tải. Điều này là không thể chấp nhận tất nhiên vì vậy tôi đã phải theo dõi vấn đề. Cuối cùng tôi đã theo dõi chức năng/phương thức vi phạm pdo :: construct. Tôi cũng thấy rằng mysql_connect mất khoảng 1 giây để tạo kết nối. Sau một chút googling tôi tìm thấy một giải thích rằng php đã có vấn đề với IPv6 và bạn có thể khắc phục vấn đề bằng cách vô hiệu hóa IPv6 hoặc chuyển sang ipaddress 127.0.0.1 khi thực hiện kết nối của bạn.

Tôi tự hỏi vấn đề của IPv6 trên PHP là gì, chỉ muốn hiểu rõ hơn về vấn đề này. Cảm ơn.

+0

là mysql server của bạn chạy trên :: 1? Nếu không php có thể sẽ cố gắng kết nối thông qua ipv6 và nếu không thành công nó sẽ rơi trở lại ipv4. Điều đó sẽ yêu cầu lâu hơn một chút. – konqi

+1

Xin lỗi vì điều đó tôi không hiểu "Máy chủ mysql của bạn đang chạy trên :: 1?" có nghĩa? Nó có nghĩa là chạy một số máy chủ mysql trên cùng một máy? –

+0

Cảm ơn câu hỏi này. Tôi chỉ cần tăng tốc trang web của tôi rất nhiều bằng cách sử dụng 127.0.0.1 thay vì localhost. –

Trả lời

27

PHP đang cố mở kết nối tới máy chủ cục bộ. Bởi vì máy tính của bạn được kết nối với mạng của bạn thông qua IPv6 nó đang cố gắng phiên bản IPv6 của 'localhost' đầu tiên, đó là đó là một địa chỉ IP của :: 1

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

:: 1/128 - Các địa chỉ loopback là địa chỉ unicast localhost. Nếu ứng dụng trong máy chủ gửi gói đến địa chỉ này, ngăn xếp IPv6 sẽ lặp lại các gói này trở lại trên cùng một giao diện ảo (tương ứng với 127.0.0.0/8 trong IPv4).

Có vẻ như máy chủ MySQL của bạn không nghe địa chỉ đó, thay vào đó nó chỉ bị ràng buộc với địa chỉ IPv4 và vì vậy khi PHP không mở được kết nối, nó cố gắng mở localhost qua IPv4 aka 127.0. Cá nhân tôi thích sử dụng địa chỉ IP hoặc sử dụng ête tệp máy chủ Windows hoặc Mac tương đương để xác định tên miền 'giả mạo' và sau đó sử dụng chúng khi kết nối với MySQL, giải quyết thành địa chỉ IP. Dù bằng cách nào tôi cũng có thể biết chính xác địa chỉ IPv4 hoặc IPv6 sẽ được sử dụng hay không.

Cả MySQL và Apache đều hỗ trợ IPv6 nhưng bạn phải yêu cầu họ sử dụng địa chỉ IPv6 một cách rõ ràng. Đối với MySQL xem: http://dev.mysql.com/doc/refman/5.5/en/ipv6-server-config.html

cho config Apache xem: http://httpd.apache.org/docs/2.2/bind.html

Apache hỗ trợ nhiều địa chỉ IP để bạn có thể sử dụng cả hai cùng một lúc - nếu card mạng trong máy có cả địa chỉ IPv4 và IPv6. MySQL chỉ hỗ trợ một địa chỉ.

+0

Tôi đã thực hiện một số bước để xem xét vấn đề. Lần đầu tiên tôi đã đi đến C:/Windows/System32/drivers/etc/để xem các tập tin máy chủ cửa sổ và thấy rằng tất cả các thông tin bên trong đã được nhận xét. Vì vậy, tôi uncommented "127.0.0.1 localhost" và thực hiện các mysql connetion. Thời gian thực hiện là khoảng 10 ms. Sau đó, tôi quay trở lại file host, nhận xét "127.0.0.1 localhost" và uncommented ":: 1 localhost". Sau đó, tôi chạy chương trình một lần nữa. Kết quả là, chương trình không thể kết nối với máy chủ mysql. –

+0

Phiên bản của máy chủ mysql là 5.1.03. Vì vậy, tôi kết luận rằng vấn đề có thể là do thiếu sự hỗ trợ của ipv6 bởi máy chủ Mysql. Vì vậy, các giải pháp có thể tránh được bằng cách sử dụng ipv6 hoặc cho phép hỗ trợ máy chủ MySQL ipv6. Bất kỳ đề xuất và bổ sung được hoan nghênh. –

+0

Tôi sử dụng "netstat -an" thông qua cmd và thấy rằng có hai dòng: "TCP 0.0.0.0:80 0.0.0.0:0 LISTENING" và "TCP 0.0.0.0:3306 0.0.0.0:0 LISTENING". Nhưng không có [::]: 80 hoặc [::]: 3306. Điều này có nghĩa rằng cả apache và mysql không hỗ trợ ipv6? –

10

PHP đang cố gắng để kết nối với "localhost" trong Windows 7/8/10 đó là :: 1, nhưng MySQL không được lắng nghe trên socket IPv6, bạn có thể áp dụng một vài sửa:

1) Trong máy chủ của bạn tập tin (C:/windows/system32/drivers/etc/host) bộ localhost 127.0.0.1 để

2) Trong PHP server thay đổi MySQL từ localhost 127.0.0.1 để

3) Trong my.ini, thêm hoặc chỉnh sửa: bind-address = ::

Nếu địa chỉ là ::, máy chủ chấp nhận các kết nối TCP/IP trên tất cả các giao diện IPv4 và IPv6 của máy chủ lưu trữ . Sử dụng địa chỉ này để cho phép cả hai kết nối IPv4 và IPv6 trên cả hai giao diện máy chủ đều có kết nối IPv4 và IPv6.

lựa chọn đề nghị nếu bạn có MySQL> = 5.5.3

+1

bind-address = :: đã giúp tôi! –

+0

Tùy chọn 1 không hoạt động trên Windows 7 trở lên. – marcovtwout

+0

@marcovtwout Phiên bản MySQL nào? Bạn đã gặp lỗi gì? –

Các vấn đề liên quan