mysql_connect (localhost / 127.0.0.1) 在 Windows 平台上速度慢

2024-01-01

我使用的是 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秒。

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

我尝试在网上查找根本原因,结果如下:

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

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


PHP 正在尝试打开与本地主机的连接。因为您的计算机通过 IPv6 连接到网络,所以它首先尝试 IPv6 版本的“localhost”,即 IP 地址 ::1

http://en.wikipedia.org/wiki/IPv6_address#Special_addresses 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 http://dev.mysql.com/doc/refman/5.5/en/ipv6-server-config.html

Apache 配置请参见:http://httpd.apache.org/docs/2.2/bind.html http://httpd.apache.org/docs/2.2/bind.html

Apache 支持多个 IP 地址,因此您可以同时使用这两个地址 - 如果计算机中的网卡同时具有 IPv4 和 IPv6 地址。 MySQL只支持一个地址。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql_connect (localhost / 127.0.0.1) 在 Windows 平台上速度慢 的相关文章

随机推荐