我正在使用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毫秒。
127.0.0.1
localhost
我试图在互联网上找到根本原因,结果是:
最近,我将开发从XP迁移到Windows 7,发现我开发的网页加载时间长达5秒。这当然是不可接受的,所以我不得不找出问题所在。我最终找到了令人讨厌的功能/方法pdo :: construct。我还发现mysql_connect大约需要1秒才能建立连接。经过一番谷歌搜索后,我发现一种解释,说明php的IPv6存在问题,您可以通过在建立连接时禁用IPv6或切换到ipaddress 127.0.0.1来解决此问题。
我想知道PHP上IPv6的问题是什么,只是想更深入地了解。谢谢。
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仅支持一个地址。