小编典典

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

mysql

我正在使用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毫秒。

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

最近,我将开发从XP迁移到Windows
7,发现我开发的网页加载时间长达5秒。这当然是不可接受的,所以我不得不找出问题所在。我最终找到了令人讨厌的功能/方法pdo ::
construct。我还发现mysql_connect大约需要1秒才能建立连接。经过一番谷歌搜索后,我发现一种解释,说明php的IPv6存在问题,您可以通过在建立连接时禁用IPv6或切换到ipaddress
127.0.0.1来解决此问题。

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


阅读 342

收藏
2020-05-17

共1个答案

小编典典

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无法打开连接,它将回退并尝试通过aka
127.0.0.1的IPv4打开本地主机

我个人更喜欢使用IP地址或使用Windows主机文件或等效于Mac的Mac来定义“假”域名,然后在连接到可解析为IP地址的MySQL时使用这些域名。无论哪种方式,我都可以确切知道将使用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仅支持一个地址。

2020-05-17