静态分析工具,用于检测PHP应用程序中的表依赖关系


Static Analysis tool to detect table dependencies in PHP application

我正在处理一个大型的遗留PHP项目。我们面临的问题是,许多php脚本与数据库紧密耦合,这使得管理和更改应用程序非常困难,因为我们不清楚什么样的更改会破坏什么。

代码并不是真的那么聪明。大多数db调用看起来像

$theQuery = "select * from $theDatabase.TABLEName";
$theResult = mysql_query($theQuery);
//Do some rendering

所以大多数表依赖关系应该在代码中直接检测到,而不需要分析代码的运行时行为。有没有一种工具(付费或免费)能让你指向一个php文件然后给它一个表名列表让它查找它会遍历文件和文件的所有包含内容然后给你一个受php脚本影响的表列表?

如果不能保证正确性也可以。任何信息都比我们现在的处境要好!

谢谢!

您可以在两个级别上执行此操作。

  • 一个完整的静态分析,跟踪字符串片段组装到SQL调用中,检查字符串作为SQL文本(解析)并提取所需的信息。由于您的程序可能与多个数据库通信,因此还需要跟踪数据库连接步骤('theDatabase'值的来源),以便确定表和列应该是什么。这真的很难:需要一个完整的PHP解析器,控制和数据流分析(面对动态语言,呃),SQL解析和提取。这样的工具可能存在,但它会让我大吃一惊。(我的公司建立定制工具,我们试图跟踪这类事情)。

  • 一个从代码中提取所有字符串片段的hueristic("select * from"answers"TABLEName"),并试图从中猜测表和列。为此,你需要一些东西来提取所有的字符串,并将它们拆开寻找证据。你在你的例子中唯一的证据是"select *"(意思是"所有列")和"TABLEName";如果您有一组数据库模式,则可以根据表名进行匹配以确定列。

无论哪种情况,你都需要某种程度上解析PHP的东西;第一种情况比PHP解释器要好(您必须跨可能涉及的所有文件进行流分析),第二种情况在词素级别。

我们的DMS软件再造工具包及其PHP前端将是深度语义分析工具的起点。有很多工作要做。

我们的源代码搜索引擎可能是一个很好的起点,为hueristic工具。它可以很容易地提取所有字符串片段(即使对PHP来说也很准确,这比看起来要困难得多)和位置。也许PHP标记器在这方面做得足够好。有了这些信息,从字符串片段中提取表名的额外代码应该不会太难。

JetBrains PHPStorm IDE中的重构/替换工具可以做到这一点。

请参阅文档中的重命名对话框和查找用法对话框。

如果你需要澄清,请告诉我