2012-07-26 1 views
20

Windows 7, Apache 2, PHP 5, MySQL 5를 사용하고 있습니다. 모두 같은 컴퓨터에 있습니다.Windows 플랫폼에서 mysql_connect (localhost/127.0.0.1)이 느림

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

위의 코드의 실행 시간이 1 초 이상 : 나는 흥미로운 문제를 발견, 나는 다음과 같은 코드가 있습니다.

localhost 대신 127.0.0.1을 사용하면 실행 시간은 약 10ms입니다.

나는 인터넷에서 근본적인 이유를 찾기 위해 노력하고,이 결과 : 제가 최근에 윈도우 7에 XP에서 내 개발을 이동 내가 개발 한 웹 페이지가 긴 5 초 복용 사실을 발견

하중. 물론 이것은 받아 들일 수없는 것이므로 문제를 추적해야했습니다. 결국 불쾌한 함수/메소드 pdo :: construct를 추적했습니다. 나는 또한 mysql_connect가 약 1 초가 걸렸다는 것을 발견했다. 약간의 인터넷 검색 후 나는 PHP가 IPv6에 문제가 있다는 설명을 발견했으며, IPv6를 비활성화하거나 연결을 할 때 ipaddress 127.0.0.1로 전환하여 문제를 해결할 수있었습니다.

저는 PHP에서 IPv6의 문제점이 무엇인지 궁금합니다. 좀 더 깊이 이해하고 싶습니다. 감사.

+0

는 MySQL 서버가 :: 1에서 실행하고 있습니까? php가 아마도 ipv6를 통해 연결을 시도하고 실패 할 경우 ipv4로 다시 폴백합니다. 조금 더 오래 걸릴 것입니다. – konqi

+1

죄송합니다. "당신의 mysql 서버가 실행 중입니까?"라는 것을 이해하지 못합니다. 방법? 그것은 같은 머신에서 여러 개의 mysql 서버를 돌리는 것을 의미합니까? –

+0

고마워. 방금 localhost 대신 127.0.0.1을 사용하여 엄청나게 웹 사이트를 빠르게 만들었습니다. –

답변

27

PHP가 localhost에 대한 연결을 시도하고 있습니다. 컴퓨터가 IPv6을 통해 네트워크에 연결되어 있기 때문에 그것은 :: 1

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

:: 1/128의 IP 주소는 이는 첫 번째 '로컬 호스트'의 IPv6 버전을하려고 - 루프백 주소는 유니 캐스트 로컬 호스트 주소입니다. 호스트의 응용 프로그램이이 주소로 패킷을 보내는 경우 IPv6 스택 은 동일한 가상 인터페이스 (IPv4의 127.0.0.0/8에 해당)에서 이러한 패킷을 다시 루프합니다. MySQL 서버가 대신에만 IPv4 주소에 바인딩 된 그래서 PHP가 다시 떨어지는 연결을 여는 데 실패하고 IPv4를 통해 일명 127.0를 로컬 호스트를 열려고하면, 해당 주소로 수신되지 않는 것처럼

는 것 같습니다. 0.1

필자는 개인적으로 IP 주소를 사용하거나 Windows 호스트 파일이나 Mac과 같은 것을 사용하여 '가짜'도메인 이름을 정의한 다음 IP 주소로 확인되는 MySQL에 연결할 때이를 사용합니다. 어느 쪽이든 나는 IPv4 또는 IPv6 주소가 사용되는지 정확하게 알 수 있습니다.

MySQL과 Apache 모두 IPv6를 지원하지만 명시 적으로 IPv6 주소를 사용하도록 알려야합니다. MySQL은 다음을 참조하십시오 아파치 설정에 대한 http://dev.mysql.com/doc/refman/5.5/en/ipv6-server-config.html

참조 : 한 번에 모두 사용할 수 있도록 http://httpd.apache.org/docs/2.2/bind.html

아파치는 여러 개의 IP 주소를 지원합니다 - 컴퓨터의 네트워크 카드는 IPv4 및 IPv6 주소를 모두있는 경우. MySQL은 하나의 주소 만 지원합니다.호스트에서

1) :

+0

나는이 문제를 조사하기 위해 몇 가지 조치를 취했다. 나는 C :/Windows/System32/drivers/etc /에 가서 Windows 호스트 파일을보고 내부의 모든 정보가 주석 처리되었음을 발견했다. 그래서 "127.0.0.1 localhost"의 주석을 풀고 mysql 연결을 실행했다. 실행 시간은 약 10ms입니다. 그런 다음 호스트 파일로 돌아가서 "127.0.0.1 localhost"를 주석 처리하고 ":: 1 localhost"를 주석 처리하지 않았습니다. 그 후, 나는 프로그램을 다시 실행했다. 결과적으로 프로그램은 mysql 서버에 연결할 수 없습니다. –

+0

mysql 서버의 버전은 5.1.03입니다. 따라서이 문제는 아마도 MySQL 서버가 ipv6를 지원하지 않아서 발생한 것일 수 있습니다. 따라서 솔루션은 ipv6 사용을 피하거나 MySQL 서버 ipv6 지원을 활성화 할 수 있습니다. 어떤 제안이나 보완책도 환영합니다. –

+0

나는 cmd를 통해 "netstat -an"을 사용하고 "TCP 0.0.0.0:80 0.0.0.0:0 LISTENING"과 "TCP 0.0.0.0:3306 0.0.0.0:0 LISTENING"이라는 두 줄이 있음을 확인합니다. 그러나 [::] : 80 또는 [::] : 3306이 없습니다. 이것은 apache와 mysql이 ipv6를 지원하지 않는다는 것을 의미합니까? –

10

PHP는 "localhost"를 윈도우 7/8/10에가 : 1이지만, MySQL은 IPv6를 소켓에서 수신 대기하지 않습니다, 당신은 몇 가지 수정 사항을 적용 할 수 있습니다 연결을 시도하는 파일 (C :/윈도우/system32를/드라이버/등/호스트) 설정 로컬 호스트는

2) PHP에서 로컬 호스트에서 MySQL 서버 변경의 my.ini에서

3) 127.0.0.1에 127.0.0.1하기 추가 또는 수정 : bind-address = ::

if 주소가 :: 인 경우 서버는 모든 서버 호스트의 IPv4 및 IPv6 인터페이스에서 TCP/IP 연결을 허용합니다. 이 주소를 사용하여 모든 서버 인터페이스에 IPv4 및 IPv6 연결을 허용하십시오. 당신이있는 경우

옵션을 제안 MySQL의> = 5.5.3

+1

bind-address = :: 나를 도왔습니다! –

+0

옵션 1은 Windows 7 이상에서는 작동하지 않습니다. – marcovtwout

+0

@marcovtwout 어떤 MySQL 버전입니까? 어떤 오류가 있었습니까? –

관련 문제