2012-07-26 9 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を使用すると、実行時間は約10ミリ秒です。

私は、インターネット上の根本的な理由を見つけることを試み、これが結果です:

私は最近、XPからWindows 7への私の開発を移動し、私が開発したウェブページがに長い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サーバは:: 1で動作していますか?手段?それは、同じマシン上でいくつかのmysqlサーバを走らせることを意味していますか? –

+0

ありがとうございます。私は、localhostではなく127.0.0.1を使用して、私のウェブサイトを大幅に高速化しました。 –

答えて

27

PHPがlocalhostへの接続を開こうとしています。お使いのコンピュータがIPv6経由でネットワークに接続されているので、それは:: 1

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

:: 1/128のIPアドレスがあるこれは最初の「localhost」ののの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の場合参照:Apacheの設定については http://dev.mysql.com/doc/refman/5.5/en/ipv6-server-config.html

参照してください。一度に両方を使用できるように http://httpd.apache.org/docs/2.2/bind.html

Apacheは複数の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"という2つの行があることを確認します。しかし、[::]:80や[::]:3306はありません。これは、apacheとmysqlの両方がipv6をサポートしていないことを意味していますか? –

10

PHPをWindows 7/8/10には「localhost」に接続しようとしていることが:: 1ですが、MySQLはIPv6ソケット上で待機していない、あなたはいくつかの修正適用することができます。あなたのホストで

1)ファイル(C:/窓/ system32に/ドライバの/ etc /ホスト)セットlocalhostが、

2)PHPのlocalhostから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バージョンですか?どのようなエラーがありましたか? –

関連する問題