web-dev-qa-db-ja.com

Windowsプラットフォームでmysql_connect(localhost / 127.0.0.1)が遅い

私はWindows7、Apache 2、PHP 5、MySQL 5、すべてが同じマシン上にあります。興味深い問題を見つけました。次のコードがあります。

    $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からWindows7に移行しましたが、開発したWebページの読み込みに5秒かかることがわかりました。もちろんこれは受け入れられないため、問題を追跡する必要がありました。最終的には問題のある関数/メソッドpdo :: constructを追跡しました。また、mysql_connectが接続を確立するのに約1秒かかっていることもわかりました。少しグーグルした後、phpにIPv6の問題があり、どちらかで問題を修正できるという説明を見つけました。接続時にIPv6を無効にするか、ipaddress127.0.0.1に切り替えます。

PHPでのIPv6の問題は何であるか、もっと深く理解したいだけなのだろうか。ありがとう。

21
WaiKit Kung

PHPはローカルホストへの接続を開こうとしています。コンピューターはIPv6経由でネットワークに接続されているため、最初にIPv6バージョンの「localhost」を試行します。これは:: 1のIPアドレスです。

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

:: 1/128 —ループバックアドレスはユニキャストローカルホストアドレスです。ホスト内のアプリケーションがこのアドレスにパケットを送信する場合、IPv6スタックはこれらのパケットを同じ仮想インターフェイス(IPv4の127.0.0.0/8に対応)でループバックします。

MySQLサーバーがそのアドレスをリッスンしていないようですが、代わりにIPv4アドレスにバインドされているため、PHPが接続を開くことができないと、フォールバックしてIPv4経由でローカルホストを開こうとします別名127.0.0.1

私は個人的に、IPアドレスを使用するか、WindowsホストファイルまたはMacと同等のエーテルを使用して「偽の」ドメイン名を定義し、MySQLに接続するときにIPアドレスに解決するものを使用することを好みます。どちらの方法でも、IPv4アドレスとIPv6アドレスのどちらが使用されるかを正確に知ることができます。

MySQLとApacheはどちらもIPv6をサポートしていますが、IPv6アドレスを明示的に使用するように指示する必要があります。 MySQLについては、以下を参照してください。 http://dev.mysql.com/doc/refman/5.5/en/ipv6-server-config.html

Apacheの設定については、以下を参照してください。 http://httpd.Apache.org/docs/2.2/bind.html

Apacheは複数のIPアドレスをサポートしているため、マシンのネットワークカードにIPv4アドレスとIPv6アドレスの両方がある場合は、両方を同時に使用できます。 MySQLは1つのアドレスのみをサポートします。

28
Danack

PHPはWindows7/8/10で「localhost」に接続しようとしています。これは:: 1ですが、MySQLはIPv6ソケットをリッスンしていません。いくつかの修正を適用できます。

1)ホストファイル(C:/ windows/system32/drivers/etc/Host)でlocalhostを127.0.0.1に設定します

2)PHP MySQLサーバーがlocalhostから127.0.0.1に変更されました

3)my.iniで、次を追加または編集します。bind-address= ::

アドレスが::の場合、サーバーはすべてのサーバーホストIPv4およびIPv6インターフェイスでTCP/IP接続を受け入れます。このアドレスを使用して、すべてのサーバーインターフェイスでIPv4接続とIPv6接続の両方を許可します。

MySQL> = 5.5.3を使用している場合の推奨オプション

10
Jose Nobile