Задать вопрос

Есть ли готовые решения для построения дерева зависимостей между файлами?

Хотелось бы получить(json,ini, ассоциативный массив,xml- как угодно) дерево включения файлов(что-то вроде этого).

Задача может быть решена тремя путями:
  • 1. перегрузкой стандартных конструкций
  • 2. какими-то магическими параметрами в отладчике(xdebug торт, но полную информацию о зависимостях между файлами не даёт)
  • 3. grep-ом и созданием альтернатив(вроде ov_include и ловля источника через debug_backtrace)
  • 4. с помощью силы воли и глаз пройтись по всем файлам


Первый вариант требует вмешательство в интерпретатор и трудозатраты на актуализацию патча под новые версии php.
Второй мне неизвестен. На всякий случай, конфиг Xdebug:

zend_extension_ts="D:\PHP\ext\php_xdebug.dll"
xdebug.profiler_enable = 1
xdebug.profiler_output_dir = "D:\server\profiling\"
xdebug.trace_output_name = %t.%s.%H
xdebug.collect_params 1
xdebug.collect_return 1
xdebug.collect_vars 1
xdebug.default_enable 1
xdebug.show_mem_delta 1
php_flag xdebug.auto_trace 1
xdebug.trace_format 1


Третий классный и наверное самый простой, но с точки зрения производительности суровый(создали static списковый массив внутри функции, который проверяет не пытаемся ли мы зациклиться или включить уже имеющийся файл, обработать backtrace, записать результаты) когда много файлов.
Четвёртый для больших проектов не подойдет.

Зачем.
Сейчас джуниоров набираю, а документация для движка готова лишь на треть. Хочется на плоттере распечатать схему работы каждой страницы, чтобы ребятам не пришлось угадывать откуда и что.
  • Вопрос задан
  • 3436 просмотров
Подписаться 6 Оценить Комментировать
Решения вопроса 1
Пригласить эксперта
Ответы на вопрос 3
@LastDragon
> Xdebug был бы замечательным вариантом, но ни одна утилита, работающая с его выходным файлом не содержит функционала слежки за инклудами
Так я и предлагаю реализовать это самому, тем более формат очень простой и похоже вся логика сведется к отслеживанию «fn=require_once::...» (cfn)

Пример:
fl=ips_kernel/classDbMysql.php
fn=require_once::ips_kernel/classDbMysql.php
1 91512
cfn=php::define
calls=1 0 0
25 4
cfn=php::class_exists
calls=1 0 0
30 5
cfn=php::dirname
calls=1 0 0
32 1
cfn=require_once::ips_kernel/classDb.php
calls=1 0 0
32 36
cfn=php::extension_loaded
calls=1 0 0
1066 1
cfn=php::defined
calls=1 0 0
1066 5
cfn=php::dirname
calls=1 0 0
1068 1
cfn=require::ips_kernel/classDbMysqliClient.php
calls=1 0 0
1068 79


Подключение:
ips_kernel/classDbMysql.php
    -> ips_kernel/classDb.php
    -> ips_kernel/classDbMysqliClient.php


НО, дерево будет справедливо только для текущего скрипта (т.е. может зависеть от вх. параметров), это можно решить скриптом, которому будет скармливаться xdebug-файл, а на выходе будет дерево для него.
Ответ написан
@LastDragon
5) Использовать выходной файл xdebug — в нем есть вся информация и распарсить его, по-моему, проще (http://kcachegrind.sourceforge.net/html/CallgrindFormat.html).
Ответ написан
Gorthauer87
@Gorthauer87
Программист
А подсмотреть в коде интерпретатора, что делает include, нет возможности? Возможно там уже решение описано
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы