我正在开发一个非常大的 PHP 代码库(主要是程序性的),在过去 10 年里,我之前的开发人员拼凑了这个代码库,我们现在正经历着沉重的数据库负载。查看某些文件会显示正在执行的 MySQL 查询超过 40 到 60 个。花时间在这个令人讨厌的大文件中追踪它们的用途通常表明它们已进行查询并且从未使用过结果。我觉得如果我能确定代码库中的问题区域,我就可以开始重构了。
我在 StackOverflow 上看到过很多关于各种审计工具的帖子:
- https://stackoverflow.com/questions/4273244/auditing-a-php-codebase?lq=1
- 是否有用于 PHP 文件的静态代码分析器 [如 Lint]?
不过,我还没有找到任何可以分析脚本中查询使用情况的东西。例如,文件中包含多少 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 文件?
我的目标是确定重构遗留程序代码最有益的点。