我使用的是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问题是什么,只是想深入了解。感谢。
答案 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
,建议的选项