AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 408550
Accepted
Hubro
Hubro
Asked: 2012-07-18 07:51:33 +0800 CST2012-07-18 07:51:33 +0800 CST 2012-07-18 07:51:33 +0800 CST

从 PHP 连接到 MySQL 非常慢

  • 772

我刚刚全新安装了 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);

上面的脚本运行只需要大约 3 秒(尽管我第一次运行它时加载时间接近 8 秒。)

然后检查它是否是我尝试使用的 PDO 的错误mysql_connect:

$con = mysql_connect("localhost", "root", "");
mysql_select_db("mysql", $con);
$result = mysql_query('SELECT host,user,password FROM user;');

需要同样长的时间才能完成。

一开始我以为是 PHP 的错,但 PHP 代码和静态文件的服务速度比我单击刷新时更快。我通过运行这个小脚本来测试 PHP:

header("Content-Type: text/plain");

for($i = 0; $i < 5000; $i++)
{
    echo sha1(rand()) . "\n";
}

5000 次sha1计算,页面显示速度仍然快于我刷新窗口的速度。

然后我认为这是MySQL的错。但同样,没有进行太多测试就发现 MySQL 的工作速度比我需要的要快。使用 MySQL CLI 客户端,用户选择查询甚至不需要花费可测量的时间——它在我按下返回键之前就已经完成了。

问题一定是 PHP 与 MySQL 的连接——据我所知。我可以找到很多关于 PHP 速度慢或 MySQL 速度慢的东西,但没有关于 PHP+MySQL 非常慢的东西。

感谢任何能帮我解决这个问题的人!


我正在为 win32 使用 XAMPP 1.8.0(下载链接)
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);

输出:

连接时间:1.006148
查询时间:0.000247

什么会导致 PHP 花费大量时间连接到数据库?CLI 客户端、HeidiSQL 和 MySQL 工作台即时连接

windows mysql php xampp
  • 6 6 个回答
  • 88310 Views

6 个回答

  • Voted
  1. DaveRandom
    2013-03-16T07:42:55+08:002013-03-16T07:42:55+08:00

    这几乎是从我在这里的回答中逐字记录的,但我知道我们不赞成 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 起,解析已内置到 DNS 解析器中localhost,原因如下所述。这意味着 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 连接。

    我需要修改主机文件吗?

    不。不要修改主机文件。DNS 解析器知道要做什么localhost,重新定义它最多不会有任何效果,最坏的情况是会混淆解析器。

    怎么样--skip-name-resolve?

    出于相关但略有不同的原因,这也可能解决问题。

    如果没有此配置选项,MySQL 将尝试通过PTRDNS 查询将所有客户端连接 IP 地址解析为主机名。如果您的 MySQL 服务器已经启用了 IPv6,但连接仍然需要很长时间,这可能是因为反向 DNS ( PTR) 记录配置不正确。

    禁用名称解析将解决此问题,但它确实有其他影响,特别是配置为在条件下使用 DNS 名称的任何访问权限Host现在都将失败。

    如果您打算这样做,您将需要将所有授权配置为使用 IP 地址而不是名称。

    • 34
  2. Best Answer
    pQd
    2012-07-18T07:55:34+08:002012-07-18T07:55:34+08:00

    是不是你的 mysql 会在你连接时尝试运行 rev-dns 查询?尝试添加到 my.cnf,部分 mysqld: skip-name-resolve。

    • 19
  3. Doug
    2012-08-23T10:32:10+08:002012-08-23T10:32:10+08:00

    通常当在服务器中启用 IPv6 时,使用 MySQL 的连接localhost非常慢。

    更改脚本中的 mysql 服务器地址以127.0.0.1解决问题。

    • 13
  4. Xesau
    2014-12-09T00:43:51+08:002014-12-09T00:43:51+08:00
    mysql_connect("localhost", "root", "");
    

    嗯,原因很明显。PHP 确实擅长某些事情,但不擅长将“localhost”直接翻译成“127.0.0.1”。您必须尝试这样做,它确实会降低您的整体网站页面加载时间,因为它阻止 PHP 检查您的 HOSTS 文件以及它没有做什么来获取“localhost”背后的真实 IP 地址

    • 2
  5. user2537018
    2015-11-25T13:42:28+08:002015-11-25T13:42:28+08:00

    将此行添加到您的主机文件中解决了我的问题

    127.0.0.1 localhost
    

    详细答案可以在这个线程中找到: https ://stackoverflow.com/questions/13584360/php-with-mysql-is-slow

    • 1
  6. Billman64
    2017-09-10T21:14:50+08:002017-09-10T21:14:50+08:00

    您还可以通过对 db 连接变量进行小幅调整来消除查询速度下降(为了可移植性,希望该变量位于脚本之外的单独文件中)。将主机值更改为“127.0.0.1”而不是“localhost”。这绕过了对本地主机的冗长 DNS 查找。

    希望这可以帮助!

    • 0

相关问题

  • 知道任何适用于 Windows 的快速可编写脚本的 ftp 客户端吗?[关闭]

  • 如果 Windows 服务崩溃,如何自动重新启动它?

  • 无法安排任务(访问被拒绝)

  • 物理机重启时自动重启虚拟机(VMWare)

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve