Инструмент статического анализа для определения табличных зависимостей в приложении PHP - PullRequest
2 голосов
/ 02 сентября 2011

Я работаю над большим унаследованным PHP-проектом.Проблема, с которой мы сталкиваемся, заключается в том, что многие из сценариев php тесно связаны с базой данных, что очень затрудняет управление приложением и его изменение, поскольку у нас нет четкого представления о том, какие изменения что-то сломают.

Код не такой уж умный.Большинство вызовов db выглядят примерно так:

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

Таким образом, большинство табличных зависимостей должны обнаруживаться непосредственно в коде без анализа поведения кода во время выполнения.Есть ли инструмент (платный или бесплатный), где вы можете указать его на php-файл и дать ему список имен таблиц для поиска, и он будет просматривать файл и все включения для этого файла и даст вам список таблицна которые влияет этот скрипт php?

Также было бы хорошо, если бы это не могло гарантировать правильность.Любая информация была бы лучше, чем там, где мы сейчас находимся!

Спасибо!

Ответы [ 2 ]

1 голос
/ 02 сентября 2011

Есть два уровня, на которых вы можете сделать это.

  • Полный статический анализ, который отслеживает сборку фрагментов строки в вызовах SQL, рассматривая строки как текст SQL (синтаксический анализ)и вытаскивая информацию, которую вы хотите.Поскольку ваша программа может взаимодействовать с несколькими базами данных, вам также необходимо проследить шаги подключения к базе данных (источники значения 'theDatabase'), чтобы вы могли определить, какими должны быть таблицы и столбцы.Это действительно сложно: требуется полный синтаксический анализатор PHP, контроль и анализ потока данных (перед лицом динамического языка, тьфу), синтаксический анализ и извлечение SQL.Такой инструмент может существовать, но он удивит меня.(Моя компания разрабатывает пользовательские инструменты, и мы пытаемся отслеживать подобные вещи).

  • Сценарий, который извлекает все фрагменты строки из вашего кода ("select * from" и "TABLEName") и пытается угадать таблицы и столбцы из этого.Для этого вам нужно что-то, что извлечет все строки и порвет их на части в поисках улик.Единственное свидетельство, которое у вас есть в вашем примере, это "select *" (что означает "все столбцы") и "TABLEName";если у вас есть набор схем баз данных, вы можете сопоставить имя таблицы для определения столбцов.

В любом случае вам понадобится что-то, что в некоторой степени проанализирует PHP;первый случай лучше, чем интерпретатор PHP (вы должны выполнить анализ потока по всем файлам, которые могут быть задействованы), второй случай на уровне лексем.

Наш инструментарий реинжиниринга программного обеспечения DMS с PHP Front End станет отправной точкой для инструмента глубокого семантического анализа.Много работы для реализации.

Наша Система поиска исходного кода может стать хорошей отправной точкой для создания универсального инструмента.Он может извлекать все строковые фрагменты (точно даже для PHP, который сложнее, чем кажется) и местоположения легко.[Возможно, токенайзер PHP делает это достаточно хорошо.] С этой информацией дополнительный код для извлечения имен таблиц из фрагментов строк не должен быть слишком сложным.

0 голосов
/ 02 сентября 2011

Инструменты рефакторинга / замены в JetBrains PHPStorm IDE могут сделать это.

См. Документы для диалога переименования и диалога поиска использования..

Дайте мне знать, если вам нужны разъяснения.

...