审核PHP的低效查询

时间:2012-11-09 20:04:33

标签: php mysql

我正在研究一个非常大的PHP代码库(主要是程序性的),在过去的10年里,我遇到的开发人员已经拼凑了大量的数据库负载。查看一些文件可显示正在执行的40到60个MySQL查询。花时间在这个大型令人讨厌的文件中找出它们的用途通常会显示它们已经进行了查询并且结果从未使用过。我觉得如果能够识别代码库中的问题区域,我就可以开始重构了。

我在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文件?

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

3 个答案:

答案 0 :(得分:5)

比许多查询都慢,查询速度慢。所以我会试着找到那些。

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

假设我建议查看xdebug以及通过分析可以实现的目标。当然,使用OOP代码可以更好地说明结果,但这可能是一个开始。有了它,您应该能够看到使用的资源/对mysql_query的调用次数。

您链接的文章似乎在讨论这个问题。这不是你想要的吗?同样,如果您特意查找SQL瓶颈,可能从数据库服务器上的慢查询日志开始。