3

我正在开发一个非常大的 PHP 代码库(主要是程序性的),在过去 10 年里,我之前的开发人员拼凑了这个代码库,我们现在正经历着沉重的数据库负载。查看某些文件会显示正在执行的 MySQL 查询超过 40 到 60 个。花时间在这个令人讨厌的大文件中追踪它们的用途通常表明它们已进行查询并且从未使用过结果。我觉得如果我能确定代码库中的问题区域,我就可以开始重构了。

我在 StackOverflow 上看到过很多关于各种审计工具的帖子:

不过,我还没有找到任何可以分析脚本中查询使用情况的东西。例如,文件中包含多少 SELECT、INSERT 和 UPDATE 查询。更有趣的是,其中有多少包含在循环结构中?我写了一个快速的脏递归文件搜索来确定一些基本问题:

   $it = new RecursiveDirectoryIterator($path);
   foreach(new RecursiveIteratorIterator($it) as $file) 
   {
      if(stristr($file, "/.") == false && stristr($file, "/..") == false)
  {
         $contents = file_get_contents($file);

         // Regular MySQL queries...indicative of SQL injection points
         $mysql_count = substr_count($contents, "mysql_query(");

         $select_count = substr_count($contents, 'SELECT ');
         $insert_count = substr_count($contents, 'INSERT INTO');
         $update_count = substr_count($contents, 'UPDATE ');

         if($mysql_count > 0 || $select_count > 0 || $insert_count > 0 || $update_count > 0)
         {
            $out[] = array('file' => $file, 
                           'mysql_count' => $mysql_count,
                           'select_count' => $select_count,
                           'insert_count' => $insert_count,
                           'update_count' => $update_count
                          );
         }

         $contents = null;
    }
}

var_dump($out);

但这并没有在循环中找到任何东西,甚至没有分析查询以查看它是否包含高阈值的 JOINS。我可以编写这样的工具,但是如果它已经存在,为什么还要重新发明轮子呢?


是否有任何工具可以识别可能存在问题/高压力/低效查询的 PHP 文件?

我的目标是确定重构遗留程序代码最有益的点。

4

3 回答 3

5

比很多查询更糟糕的是慢查询。所以我会试着找到那些。

您可以使用 MySql 的慢查询日志功能来做到这一点:http: //dev.mysql.com/doc/refman/5.6/en/slow-query-log.html

于 2012-11-09T20:22:47.060 回答
2

这里可能存在幂律分布,其中一小部分查询导致了大部分问题。按照@ficuscr 的建议使用 xdebug 将有助于识别这里最大的违规者。

您可以做的另一件事是mysql_*在运行时使用APD之类的插件更改函数。在您修改过的函数中,您可以记录当前__FILE__以及__LINE__其他相关信息(全局变量的状态等)。

于 2012-11-09T20:23:54.443 回答
1

假设我建议查看 xdebug以及它可以通过分析完成什么。使用 OOP 代码,结果当然会更有说服力,但这可能是一个开始。有了它,您应该能够看到使用的资源/对 mysql_query 的调用次数。

您链接的文章似乎讨论了这一点。这难道不是你要找的吗?同样,如果您专门寻找 SQL 瓶颈,则可能从数据库服务器上的慢查询日志开始。

于 2012-11-09T20:18:57.883 回答