2010-03-06 2 views
6

У меня есть большой сайт PHP, о котором я сейчас собираюсь позаботиться. Он содержит сотни отдельных файлов PHP, но я подозреваю, что только менее половины используется. Большинство из них, вероятно, могут быть удалены.Как определить, какие файлы PHP фактически используются, а какие нет?

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

Знаете ли вы, есть ли какой-либо инструмент, способный это сделать?

+0

Хороший вопрос, имейте в виду, что вы не можете поймать все файлы. Поскольку вы можете включать файлы динамически и какие файлы включены, может зависеть от состояния переменных. – Thirler

+0

Я не вижу причины, почему этот вопрос был приостановлен как не по теме, а этот http://stackoverflow.com/questions/1811421/determining-which-php-source-files-are-not-used вопрос не было. Более того, я считаю, что большинство ответов ниже полезно, и я отметил тот, который работал для меня лучшим в качестве ответа. – NumberFour

+0

Попробуйте также: http://php.net/inclued –

ответ

8

Посмотрите на phpxref, он может сделать то, что вам нужно.

Перекрестные ссылки PHP-классы, функции, переменные, константы и требование/включение использования.

+3

Это не будет обрабатывать вызовы через ** eval **. Он также не будет обрабатывать группы файлов, которые ссылаются друг на друга, но для которых нет ссылки извне. –

0

Существует несколько способов достижения этой цели, но все они будут связаны с ручной работой.

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

Другой способ - написать скрипт, который соответствует «include», «include_once», «require», «require_once». Возможно, проверьте также «eval» и «fopen», «file_get_contents» и т. Д. Убедитесь, что вы проверили/выполнили резервное копирование.

+0

И я просто понял - любой href = file.php также является возможным совпадением! Поэтому подход сценария/grep должен учитывать это. – MattW

2

Посмотрите phpdcd

phpdcd является код Detector Dead (DCD) для PHP кода. Он сканирует проект PHP для всех объявленных функций и методов и сообщает, что это «мертвый код», который не вызывается хотя бы один раз.

Но не ожидайте от него никаких чудес.

2

Проблема с анализом кода с помощью автоматизированного инструмента заключается в том, что вы можете найти партии файлов, которые ссылаются друг на друга, но пакет файлов никогда не используется. И наоборот, может быть файл, к которому обращаются напрямую, но не использует другие файлы и не входит в другие файлы.

Как правило, я делаю, в отчаянии, добавляет ведение журнала в каждый файл. Простая запись __FILE__ в файл журнала при доступе к файлу. Это увеличивает накладные расходы по всем направлениям. Но через определенный промежуток времени вы получаете доступ к вашему списку файлов и их использование.

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

+0

Тестовое покрытие в основном добавляет все эти данные для вас. Автоматически. См. Мой ответ. –

0

Вы можете использовать метод __construct и зарегистрировать его, если он используется. Вы не можете установить метод __construct после создания экземпляра. Поэтому добавьте их вручную;

class Someclass{ 
private $clsName; 
public function __construct(){ 
$this->clsName = get_class($this); 
YourStaticLogger::yourlogFunction("whatever you want to log" . $this->clsName); 
} 
//other things 
} 

Вы можете отслеживать только вызываемые классы. Вот что я сделал бы.

+0

Это тот же ответ, что и «добавить запись в каждый файл». –

+0

приятно, но он не будет работать для абстрактных классов и родительских классов, которые расширены дочерними классами, поскольку дочерний класс переопределит метод __construct родительского класса, и будет выполняться только один запуск __construct для каждого экземпляра. – eyurdakul

1

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

Тогда вы можете проверить те, которые, по его словам, не используются, действительно определяют, что на самом деле.

Наши SD PHP Test Coverage tool будут принимать список всех файлов, которые вы хотите проверить, и позволяют легко собирать данные о пробном покрытии. Он содержит сводный отчет о том, какие файлы имеют какой-либо охват; те, у кого 0% охвата, являются теми, которые, вероятно, мертвы.

+0

Включает ли он скрипты PHP, которые включены? Как насчет тех, которые вызывают через действие AJAX? Я считаю, что найти мертвый код среди конкретного скрипта, используя такой инструмент, как предложенный @Pekka или @gordon, был бы более подходящим. – Eldros

+0

@ Eldros: Не имеет значения, как запускается скрипт (включая AJAX). Инструментарий, помещенный в файл в списке проектов, заметит, если скрипт вызывается, и также будет отмечать * отсутствие * вызова скрипта. –

+0

@ Eldros: так называемые инструменты «статического анализа» для определения ответа путем проверки только исходного кода вряд ли будут точными. Во время выполнения можно собрать имя метода и использовать eval для его вызова; это может определить очень мало методов статического анализа (не говоря уже о тех, которые указаны в других инструментах, перечисленных другими). поэтому они могут сказать вам, что что-то не используется, даже если оно выполняется часто; они могут сказать вам, что что-то используется, даже если оно никогда не выполняется. Напротив, инструмент для тестирования будет всегда правильно говорить, если что-то используется *, о чем свидетельствует исполнение. –

Смежные вопросы