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

时间:2012-07-26 06:46:08

标签: 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);

上述代码的运行时间超过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问题是什么,只是想深入了解。感谢。

2 个答案:

答案 0 :(得分: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只支持一个地址。

答案 1 :(得分: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 = ::

  

如果地址是::,则服务器接受所有的TCP / IP连接   服务器主机IPv4和IPv6接口。使用此地址允许两者   所有服务器接口上的IPv4和IPv6连接。

如果你有MySQL&gt; = 5.5.3

,建议的选项