mysql_connect(本地主机 / 127.0.0.1)在Windows平台上速度很慢

我使用的是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);

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

当我使用 代替 时,运行时间约为10毫秒。127.0.0.1localhost

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

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

我想知道PHP上的IPv6问题是什么,只是想更深入地了解一下。谢谢。


答案 1

PHP 正在尝试打开与本地主机的连接。由于您的计算机通过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时使用这些域名,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只支持一个地址。


答案 2

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


推荐