mysql_connect(localhost/127.0.0.1)在Windows平台上运行缓慢

Wai*_*ung 21 php mysql performance localhost mysql-connect

我使用的是Windows 7,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);
Run Code Online (Sandbox Code Playgroud)

上述代码的运行时间超过1秒.

当我使用127.0.0.1而不是时localhost,运行时间约为10毫秒.

我试图在互联网上找到根本原因,结果如下:

我最近将我的开发从XP迁移到Windows 7,发现我开发的网页需要5秒钟才能加载.这当然是不可接受的,所以我不得不追查问题.我最终追踪了有问题的函数/方法pdo :: construct.我还发现mysql_connect大约需要1秒才能建立连接.经过一番谷歌搜索后,我发现一个解释说明php存在IPv6问题,你可以通过在建立连接时禁用IPv6或切换到ipaddress 127.0.0.1来解决问题.

我想知道PHP上的IPv6问题是什么,只是想深入了解.谢谢.

Dan*_*ack 28

PHP正在尝试打开与localhost的连接.由于您的计算机通过IPv6连接到您的网络,它首先尝试IPv6版本的"localhost",这是一个IP地址:: 1

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打开localhost

我个人更喜欢使用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地址,因此您可以同时使用两个IP地址 - 如果计算机中的网卡同时具有IPv4和IPv6地址.MySQL只支持一个地址.


Jos*_*ile 10

PHP正在尝试连接到Windows 7/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,建议选项