【问题标题】:Static Analysis tool to detect table dependencies in PHP application用于检测 PHP 应用程序中的表依赖关系的静态分析工具
【发布时间】:2011-09-02 17:08:31
【问题描述】:

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

代码并不是那么聪明。大多数数据库调用看起来像

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

所以大部分表依赖应该可以直接在代码中检测到,而不需要分析代码的运行时行为。是否有一个工具(付费或免费),您可以将它指向一个 php 文件并给它一个要查找的表名列表,它会查看该文件以及该文件的所有包含,并为您提供一个表列表受那个 php 脚本的影响?

如果不能保证正确性也没关系。任何信息都会比我们现在的位置更好!

谢谢!

【问题讨论】:

    标签: php static-analysis


    【解决方案1】:

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

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

    • 从代码中提取所有字符串片段(“select * from”和“TABLEName”)并尝试从中猜测表和列的启发式算法。为此,您需要能够提取所有字符串并将它们撕开以寻找证据的东西。您在示例中拥有的唯一证据是“select *”(意思是“所有列”)和“TABLEName”;如果你有一组数据库模式,你可以匹配表名来确定列。

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

    我们的DMS Software Reengineering Toolkit 及其PHP Front End 将成为深度语义分析工具的起点。有很多工作要做。

    我们的Source Code Search Engine 可能是使用hueristic 工具的良好起点。它可以轻松提取所有字符串片段(即使对于比看起来更难的 PHP 也是如此)和位置。 [也许 PHP 标记器在这方面做得很好。]有了这些信息,从字符串片段中提取表名的附加代码应该不会太难。

    【讨论】:

    • 感谢您指出搜索引擎。我要下载它,看看我能不能理解它。如果我对此有任何疑问,可以问你吗?
    • @Jason:你应该在 info@semanticdesigns.com 提出问题
    【解决方案2】:

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

    请参阅rename dialogfind usages dialog 的文档。

    如果您需要澄清,请告诉我。

    【讨论】:

      猜你喜欢
      • 2012-04-10
      • 2010-12-30
      • 2011-06-06
      • 2012-01-07
      • 2013-09-14
      • 2011-12-01
      • 1970-01-01
      • 2012-06-24
      • 1970-01-01
      相关资源
      最近更新 更多