Сведения о вопросе

FromRussia

18:17, 17th August, 2020

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

Просмотров: 369   Ответов: 4

Хотелось бы получить(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, записать результаты) когда много файлов.
Четвёртый для больших проектов не подойдет.

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



  Сведения об ответе

SSESION

12:36, 10th August, 2020

  Сведения об ответе

darknet

00:34, 4th August, 2020

> 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-файл, а на выходе будет дерево для него.


  Сведения об ответе

appple

05:51, 26th August, 2020

5) Использовать выходной файл xdebug — в нем есть вся информация и распарсить его, по-моему, проще (http://kcachegrind.sourceforge.net/html/CallgrindFormat.html).


  Сведения об ответе

DINO

21:25, 8th August, 2020

А подсмотреть в коде интерпретатора, что делает include, нет возможности? Возможно там уже решение описано


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться