Hub*_*bro 23 mysql windows php xampp
我刚刚重新安装了 XAMPP。当第一次打开 PHPMyAdmin 时,我注意到它非常慢。在 localhost 上打开每个页面需要将近 5 秒的时间是没有意义的。我做了一个小测试案例来转移对 PHPMyAdmin 的指责:
$con = new PDO("mysql:host=localhost;dbname=mysql", "root", "");
$statement = $con->query('SELECT host,user,password FROM user;');
$users = $statement->fetchAll(PDO::FETCH_ASSOC);
Run Code Online (Sandbox Code Playgroud)
上面的脚本运行只需要大约 3 秒(尽管我第一次运行它需要接近 8 秒才能加载。)
然后检查它是否是 PDO 的错,我尝试使用mysql_connect:
$con = mysql_connect("localhost", "root", "");
mysql_select_db("mysql", $con);
$result = mysql_query('SELECT host,user,password FROM user;');
Run Code Online (Sandbox Code Playgroud)
需要同样长的时间才能完成。
一开始我以为是 PHP 的错,但是 PHP 代码和静态文件的提供速度比我单击刷新要快。我通过运行这个小脚本来测试 PHP:
header("Content-Type: text/plain");
for($i = 0; $i < 5000; $i++)
{
echo sha1(rand()) . "\n";
}
Run Code Online (Sandbox Code Playgroud)
5000 次sha1计算后,页面的显示速度仍然比我刷新窗口的速度要快。
然后我认为这是MySQL的错。但同样,没有进行太多测试就可以确定 MySQL 的运行速度比我需要的要快。使用 MySQL CLI 客户端,用户选择查询甚至不需要可测量的时间 - 它在我什至让返回键出现之前就完成了。
问题一定是 PHP 与 MySQL 的连接——据我所知。我可以找到大量关于 PHP 速度慢或 MySQL 速度慢的内容,但没有关于 PHP+MySQL 速度极慢的内容。
感谢任何能帮我解决这个问题的人!
我正在使用 XAMPP 1.8.0 for win32(下载链接)
PHP 版本:5.4.4
MySQL 版本:14.14
编辑:计时后,结果是连接函数花费了这么长时间:
$time = microtime(true);
$con = mysql_connect("localhost", "root", "");
mysql_select_db("mysql", $con);
$con_time = microtime(true);
$result = mysql_query('SELECT host,user,password FROM user;');
$sel_time = microtime(true);
printf("Connect time: %f\nQuery time: %f\n",
$con_time-$time,
$sel_time-$con_time);
Run Code Online (Sandbox Code Playgroud)
输出:
连接时间:1.006148 查询时间:0.000247
什么会导致 PHP 花费大量时间连接到数据库?CLI 客户端、HeidiSQL 和 MySQL 工作台立即连接
Dav*_*dom 34
这几乎是从我在这里的回答中逐字逐句地提取出来的,但我知道我们对 SO 上仅提供链接的答案不屑一顾,所以我想你们也一样 :-)
如果您遇到此问题并且使用的是 Windows 7 之前的 Windows 版本,则这可能不是您问题的答案。
为什么会这样?
此问题的原因是 IPv4 与 IPv6。
当您使用主机名而不是 IP 地址时,MySQL 客户端首先AAAA为该名称运行(IPv6) 主机查找,如果成功将名称解析为 IPv6 地址,则首先尝试该地址。如果任一步骤失败(名称解析或连接),它将回退到 IPv4,运行A查找并尝试使用此主机。
这在实践中意味着,如果 IPv6localhost查找成功但 MySQL 未绑定到 IPv6 环回,则您将需要等待一个连接超时周期,然后 IPv4 回退发生并连接成功。
这在 Windows 7 之前不是问题,因为localhost解析是通过主机文件完成的,并且它只预先配置了127.0.0.1- 它没有与 IPv6 对应::1。
但是,从 Windows 7 开始,localhost解析内置于 DNS 解析器中,原因在此处概述。这意味着 IPv6 查找现在将成功 - 但 MySQL 未绑定到该 IPv6 地址,因此连接将失败,您将看到此问题中概述的延迟。
那很好。只要告诉我如何修复它!
你有几个选择。环顾互联网,一般的“解决方案”似乎是明确使用 IP 地址而不是名称,但有几个原因不这样做,两者都与可移植性有关,两者都可以说并不重要:
如果您将脚本移到另一台仅支持 IPv6 的机器上,您的脚本将不再起作用。
如果您将脚本移至基于 *nix 的托管环境,则魔术字符串localhost将意味着 MySQL 客户端将更喜欢使用 Unix 套接字(如果已配置),这比基于 IP 环回的连接更有效
不过,它们听起来很重要?
他们不是。您应该设计您的应用程序,以便在配置文件中定义此类内容。如果您将脚本移至另一个环境,则可能还需要配置其他内容。
总之,使用 IP 地址不是最好的解决方案,但它很可能是可以接受的。
那么最好的解决方案是什么?
最好的方法是更改 MySQL 服务器使用的绑定地址。然而,这并不像人们想象的那么简单。与 Apache、Nginx 和几乎所有其他健全的网络服务应用程序不同,MySQL 仅支持单个绑定地址,因此不仅仅是添加另一个绑定地址的情况。幸运的是,操作系统确实在这里支持了一些魔法,因此我们可以让 MySQL 同时使用 IPv4 和 IPv6。
您需要运行 MySQL 5.5.3 或更高版本,并且需要使用--bind-address=命令行参数启动 MySQL 。您有 4 个选项docs,具体取决于您要执行的操作:
您可能熟悉的一种,以及您最有可能(有效)使用的一种,0.0.0.0. 这将绑定到机器上所有可用的 IPv4 地址。即使您不关心 IPv6,这实际上也可能不是最好的做法,因为它面临与::.
显式 IPv4 或 IPv6 地址(例如127.0.0.1或::1用于环回)。这会将服务器绑定到该地址,并且仅绑定到该地址。
魔法弦::。这将在 IPv4 和 IPv6 模式下将 MySQL 绑定到机器上的每个地址,包括环回和物理接口地址。这可能存在安全风险,仅当您需要 MySQL 接受来自远程主机的连接时才这样做。
使用IPv4 映射的 IPv6 地址。这是 IPv6 中内置的一种特殊机制,用于在 4 -> 6 转换期间向后兼容,它允许您绑定到特定的 IPv4 地址,它与 IPv6 等效。除了“双环回”地址之外,这对您不太可能有用::ffff:127.0.0.1。对于大多数人来说,这很可能是最好的解决方案,仅绑定到环回但允许 IPv4 和 IPv6 连接。
我需要修改hosts文件吗?
否。不要修改主机文件。DNS 解析器知道如何处理localhost,重新定义它充其量没有任何效果,最坏的情况是混淆解析器。
由于相关但略有不同的原因,这也可以解决问题。
如果没有此配置选项,MySQL 将尝试通过PTRDNS 查询将所有客户端连接 IP 地址解析为主机名。如果您的 MySQL 服务器已启用使用 IPv6 但连接仍然需要很长时间,这可能是因为反向 DNS ( PTR) 记录未正确配置。
禁用名称解析将解决此问题,但它确实有其他后果,特别是配置为在Host条件中使用 DNS 名称的任何访问权限现在都将失败。
如果您打算这样做,您需要将所有授权配置为使用 IP 地址而不是名称。