【问题标题】:Code Addition is Slowing Page Down代码添加正在减慢页面速度
【发布时间】:2009-09-11 18:37:06
【问题描述】:

我的客户订购了另一个脚本,但我不知道如何解决减速问题?该表大约有 50,000 行。

 while($stats = mysql_fetch_array($get_stats)) {
  if ($stats['ip'] == gethostbyaddr($stats['ip'])) { // new code
   $is_undef = "Yes";            // causing problems
  } else { $is_undef = "No"; }      // end new code

 echo "<tr><td>" . date("d M Y g:i a ", strtotime($stats['date'])) . "</td><td>" .
       $stats['ip'] . "</td><td>" .
          parse_url_domain($stats['ref_url']) . "</td><td>" .
             $is_undef . "</td></tr>";
 }

这是查询:

 $get_stats = mysql_query("SELECT * FROM visitors WHERE site='$_GET[site]' AND date >= '$start_date' AND date <= '$end_date' ");

【问题讨论】:

  • 这是您在代码中添加的唯一内容吗?页面加载增加了多少(大约几秒钟)?
  • 你甚至没有告诉我们你有什么(如果有的话)索引。您也没有告诉预期性能,实际性能以及减速是什么。
  • 您是否对代码和查询进行了分析以查看瓶颈在哪里?分析您的查询、之前的代码和之后的代码。
  • 顺便说一句,你有一个巨大的 SQL 注入等待发生!

标签: php mysql performance


【解决方案1】:

我认为您可能对“gethostbyaddr”有疑问。循环超过 50k 次真的很慢。

另外,它与问题无关,但您可能想稍微考虑一下 sql 注入。我希望这不是您正在运行的实际查询。如果是这样,有人可以简单地放下您的桌子。

【讨论】:

  • 是的,50000 gethostbyaddr 是一个非常糟糕的主意。 50000 个 DNS 请求?!
  • 注射应该是一个新问题。
  • Norbert - 您可能希望将数据库抽象(AdoDB 或任何类型的)与查询准备和参数绑定一起使用。 +1 给 Brandon 以发现 SQL 注入。
【解决方案2】:

我建议您在将每个地址添加到数据库表之前进行此检查(即,每次查看数据时每次检查一次而不是 50,000 次!

【讨论】:

  • 是的,我最终向客户提出了建议,他接受了。谢谢。
【解决方案3】:

我猜gethostbyaddr() 很慢,因为它无法找到 IP 地址的主机。无论如何,以下表达式的目的是什么?

$stats['ip'] == gethostbyaddr($stats['ip'])

假设$stats['ip']127.0.0.1,对应的主机是localhost。因此,您可以将127.0.0.1(IP 地址)与localhost(主机名)进行比较。

【讨论】:

  • gethostbyaddr() 会在查找主机名失败时返回未修改的 IP 地址,因此相等的将表示此类失败。
  • 为什么 Ty 说。我正在尝试获取所有不返回有效主机名的 IP。
【解决方案4】:

来自http://php.net/gethostbyaddr的cmets:

“只是想让大家知道,如果 DNS 中没有列出 IP 地址,gethostbyaddr() 需要 20 多秒才能响应。”

我会说在循环中查找这些主机名可能会减慢您的速度。

您发送到该查询的变量也需要正确转义,否则您真的是在自找麻烦。

【讨论】:

    【解决方案5】:

    DNS 请求可能需要很长时间,尤其是针对 50k 条记录。如果您的客户要求使用主机名而不是 IP 地址进行记录,您可能希望运行某种后台进程来缓存主机名,而不是在每次页面加载时都查找它们。

    此外,大多数 ISP 使用 IP 地址块,因此您可以开始构建表来跟踪 ISP 的 IP 范围和主机掩码,以减少 DNS 查找

    【讨论】:

      【解决方案6】:

      我认为 gethostbyaddr() 调用会减慢您的速度。

      http://us3.php.net/manual/en/function.gethostbyaddr.php#88920

      【讨论】:

        猜你喜欢
        • 2012-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-19
        相关资源
        最近更新 更多