【问题标题】:PHP, MySQL, IIS7.5 is taking far too long for simple queriesPHP、MySQL、IIS7.5 用于简单查询的时间太长
【发布时间】:2011-03-24 03:06:41
【问题描述】:

我创建了一个简单的 PHP 测试页面,它连接到 MySQL 数据库,选择一个 int 值,然后释放结果。该页面需要 5 秒或更长时间才能加载。我看过很多关于这个或类似问题的帖子,但没有一个决议奏效。这是我得到的输出:

mysql_connect took 4.8948628902435 seconds
mysql_select_db 0.00073790550231934 seconds
mysql_query took 0.0013959407806396 seconds
mysql_free_result took 2.0980834960938E-5 seconds

如您所见,连接时间太长,其他一切都很快。

我尝试过的

  • 禁用 IPv6
  • 为 MySQL 主机使用 IP 而不是 FQDN。
  • 调整了一些配置设置。

事实

  • 所有其他非 PHP 网站都会立即响应。
  • ping MySQL 服务器会产生 1 毫秒的延迟。
  • 使用 MySQL 查询浏览器查询数据库可提供即时响应时间。

仅供参考 - 我不使用 PHP,所以在建议修复时可以像对待婴儿一样对待我。

测试脚本

<?php
    $mtime = microtime();
    $mtime = explode(' ', $mtime);
    $mtime = $mtime[1] + $mtime[0];
    $starttime = $mtime;

    mysql_connect("the_ip||the_hostname", "the_username", "the_password");

    $mtime = microtime();
    $mtime = explode(" ", $mtime);
    $mtime = $mtime[1] + $mtime[0];
    $endtime = $mtime;
    $totaltime = ($endtime - $starttime);
    echo '<h2> mysql_connect took ' .$totaltime. ' seconds</h2>';
?>

跟踪路线是瞬时的: 顺便说一句,有问题的应用程序是MantisBT 以及 Wordpress。

  1     2 ms    <1 ms    <1 ms  1.2.3.4
  2    <1 ms    <1 ms    <1 ms  MYSQL5 [5.6.7.8]

【问题讨论】:

    标签: php mysql iis-7.5 performance


    【解决方案1】:

    另一件事是“mysql_connect”,它可能表明 PHP 很难解析(查找)mysql 主机。您使用的是 IP 地址、本地主机还是主机名? (在 php 中连接到数据库时)如果是主机名,请尝试将 IP 添加到 c:\windows\system32\drivers\etc\host

    如果这不起作用。 如果您所有的“事实”都是正确的,那么您的 php 脚本可能有问题。你能把它贴出来让我看看你在跑什么吗?还要发布 mysql 表信息,如“索引”等。

    :)

    【讨论】:

    • 在“我尝试过什么”的第 2 点中,我提到我尝试过使用 IP。我将发布我正在使用的(蹩脚的)测试脚本。
    • Richard 的回答让我想起了我不久前遇到的另一个问题(Apache 和 Ubuntu,但它可能适用于这里)。 PHP 在向sendMail 发送命令时,需要花费 10 多秒的时间来处理它。我必须在 etc/hosts 文件中添加以下内容:` 127.0.0.1 localhost localhost.localdomain my-computer-name\n 173.203.87.144 my-computer-name` 这可能是一个相关问题吗? (etc/hosts 是 Linux 的主机文件en.wikipedia.org/wiki/Hosts_(file)
    • 好@Charles!学到了一些关于 mysqli 的新知识。我还不需要它,但下一个项目我会朝这个方向发展。
    • 嗨乔希。我不确定您的服务器是实时服务器还是生产服务器。但除了使用 IIS 来控制它之外,可能值得尝试其他方法。也许尝试像 XAMPP 这样的东西,它带有所有必需的包。当然,如果你没有 linux 机器可以尝试。
    • 仅供参考,我接受了这个答案,因为最终它确实是与 DNS/IP/网络相关的问题。
    【解决方案2】:

    我遇到了类似的问题,PHP 正在使用简单的 select 语句访问 MySQL,但需要很长时间才能显示。

    在另一个论坛的帮助下,那个家伙建议我创建一个新网站并给它一个不同于 80 的端口,所以我做了,在 IIS 管理器中,在站点下,添加新站点并将其指向虚拟 DIR,输入服务器的 IP 地址 192.168.2.2 并给它端口 82。

    在防火墙中打开端口 82 并从联网的 XP 机器输入浏览器 192.168.2.2:82 并且它正在发光。第一次工作。

    此外,在新网站的 IIS 管理器中,在输出缓存中,取消选中使用模式缓存,它允许页面运行并使用 php 页面输入数据。

    回复有点晚,但我想我会以任何方式分享。

    【讨论】:

      【解决方案3】:

      您能否也试试这两个测试脚本? (注意microtime 的变化——你正在做的是一个古老的 PHP4 黑客......你没有使用 PHP4,是吗?

      这个将测试 MySQLi 扩展(如果可用):

      <h1>MySQLi Test</h1>
      <?php
          $starttime = microtime(true);
      
          $db = new mysqli("the_ip||the_hostname", "the_username", "the_password");
      
          $endtime = microtime(true);
          $totaltime = ($endtime - $starttime);
          echo '<h2> mysqli_connect took ' .$totaltime. ' seconds</h2>';
      

      这个测试 PDO 扩展(如果可用):

      <h1>PDO Test</h1>
      <?php
          $starttime = microtime(true);
      
          $db = new PDO("mysql:host=host_or_ip", "the_username", "the_password");
      
          $endtime = microtime(true);
          $totaltime = ($endtime - $starttime);
          echo '<h2>PDO took ' .$totaltime. ' seconds</h2>';
      

      如果这两者都经历相同的延迟,那么我们知道这不仅仅是古老的“mysql”扩展代码中的东西。

      【讨论】:

      • 谢谢你 - 我添加了原始的 mysql_connect 并运行了所有三个,我得到:[mysql_connect 花了 4.870668888092 秒] [mysqli_connect 花了 4.8568620681763 秒] [PDO 花了 4.9574251174927 秒]
      • @Josh,这告诉我们一些有用的信息。请问您安装的是什么版本的PHP?它有php-cli.exe 吗?另外,您是在使用旧的 ISAPI DLL,还是在使用 FastCGI?
      • 您好,它是使用 FastCGI 的 PHP 5.3。 (复制我对理查德的回答发表的评论。)实际上这个问题已经神奇地解决了。我将把它归结为 DNS 问题。我在想也许从 MySQL 服务器到 Web 服务器的反向查找很慢或工作不正常?没有把握。无论如何,感谢您的帮助!
      猜你喜欢
      • 2013-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      • 2013-12-21
      相关资源
      最近更新 更多