Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
审核PHP的低效查询_Php_Mysql - Fatal编程技术网

审核PHP的低效查询

审核PHP的低效查询,php,mysql,Php,Mysql,我正在开发一个非常大的PHP代码库(主要是过程性的),在过去的10年中,由我之前的开发人员拼凑而成,我们现在正经历着沉重的数据库负载。查看一些文件,可以看到执行了40到60个以上的MySQL查询。花时间去找出它们在这个讨厌的大文件中的用途通常表明它们进行了查询,结果从未被使用过。我觉得如果我能识别代码库中的问题区域,我就可以开始重构了 我在StackOverflow上看到了许多关于各种审计工具的帖子: 不过,我还没有找到任何分析脚本中查询使用情况的方法。例如,文件中包含多少个SELECT

我正在开发一个非常大的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);
但这在循环中找不到任何东西,甚至无法分析查询以查看它是否包含高阈值的连接。我可以编写这样的工具,但如果轮子已经存在,为什么还要重新发明它呢


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


我的目标是确定对遗留过程代码进行重构最有利的地方。

假设我建议查看并了解通过分析可以实现的功能。使用OOP代码,结果当然会更具说服力,但这可能是一个开始。使用它,您应该能够看到使用的资源/调用mysql\u查询的次数


您链接的文章似乎讨论了这一点。这不是你想要的吗?同样,如果您要查找SQL瓶颈,可能首先要查找数据库服务器上的慢速查询日志。

比许多查询更糟糕的是慢速查询。所以我会努力找到那些

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


您可以做的另一件事是在运行时使用类似的插件更改
mysql.*
函数。在修改后的函数中,您可以记录当前的
\uuuu文件和
\uuu行\uuuu
以及其他相关信息(全局变量的状态等)。

基本上应该有一个文件实际接触数据库,并为应用程序的其余部分提供一个一致的接口。如果您有
mysql\u query…
分散在许多PHP文件中,那么您这样做是错误的。也就是说,不。如果不执行代码,就无法知道代码在做什么。这是一个过度简化的问题。您需要将数据库访问重构到一个可以收集自身统计信息的地方,或者在比应用程序更低的级别上进行分析。我非常了解理想情况下的工作方式,同时也是PDO和预处理语句的支持者。不幸的是,我的工作是解决这些分散在数千个文件和文件夹中的问题。我猜这是所有关于“文件”的讨论中非常程序化的。如果它真的是过程性的,根本没有数据库接口,那么假设您可以自己利用反射提出一些东西。你想学什么?我会专注于从数据库端分析,然后将连接返回到应用程序。@ficuscr是的,非常程序化。如果需要,我会写一个工具,看看是否有人已经做了一些事情来解决这个问题。我想,随着PHP成为如此流行的语言,它的理念随着时间的推移发生了变化,有许多遗留代码企业仍在使用,需要解决、优化或重构。是的,我已经看过xdebug和kcachegrind,这不是我要找的那种东西。我说的是毫无意义的代码。当有人来添加新功能时,他们会重复同样的查询,因为他们不理解以前的内容。寻找文件中查询数量、查询中连接数量等指标。我喜欢jimbojw的想法。这对于缩短从缓慢的查询日志到代码之间的差距应该是一个很好的好处。我认为实际检查SQL的最佳选择是数据库及其已经提供的工具。有趣的是,我以前从未见过APD。谢谢你们。你们可以建立一个集成测试套件来运行一堆有问题的方法,然后审核慢日志。我在phpunit中有一个测试监听器,它监视耗时超过1秒的测试,这可能表示查询出错。是的,我知道什么是慢速查询日志。谢谢。@willoller你说的是“有问题的方法”,而现实是没有函数/代码的封装……直接的过程。我敢说,PHPUnit对于遗留代码来说确实很难。在这种情况下,您可以对每个文件使用一个测试,不管怎样,您都可能希望对其进行投资。从长远来看,至少在基本的集成测试中对这些东西进行测试将有助于你取得更大的成功。看看这本书:我接受这个答案,因为这似乎是最受欢迎的投票。谢谢大家的建议。如果我最终编写了一个有用的工具来处理这个问题,我将尝试在GitHub上开源并提供一个链接。