Inclued. Профайлинг подключаемых файлов в PHP
Не все знают, но существует удобная утилита для определения подключаемых (include, require) файлов в PHP. И зовется она — Inclued. В данный момент последней версией является 0.3 (inclued-0.3.tar.gz 7.5Кб).
Inclued представляет из себя PECL-пакет, со всеми вытекающими последствиями. Что бы не дублировать информацию в интернете (а на самом деле лень писать) вот ссылка на информацию об установке PECL’овских пакетов.
Inclued версии 0.3 в процессе работы строит дерево подключений и самостоятельно сохраняет его в файл, вида inclued.XXXXX.X в dumpdir, указанный в php.ini.
Пример php.ini, для использования inclued:
...
inclued.enabled = On
inclued.dumpdir = /tmp/
...
Создадим несколько файлов:
a.php
';
b.php
';
c.php
';
d.php
';
index.php
';
var_dump(inclued_get_data());
и посмотрим, что нам «выдаст» index.php. В моем случае (с включенным xdebug) это:
a.php
d.php
c.php
b.php
index.phparray 'request' => array '_REQUEST' => array empty '_COOKIE' => array empty 'SCRIPT_FILENAME' => string '/var/www/inclued/index.php' (length=26) 'REQUEST_URI' => string '/inclued/' (length=9) 'REQUEST_TIME' => int 1200852009 'includes' => array 0 => array 'operation' => string 'include' (length=7) 'op_type' => int 2 'filename' => string 'a.php' (length=5) 'opened_path' => string '/var/www/inclued/a.php' (length=22) 'fromfile' => string '/var/www/inclued/index.php' (length=26) 'fromline' => int 2 1 => array 'operation' => string 'include_once' (length=12) 'op_type' => int 4 'filename' => string 'b.php' (length=5) 'opened_path' => string '/var/www/inclued/b.php' (length=22) 'fromfile' => string '/var/www/inclued/index.php' (length=26) 'fromline' => int 3 2 => array 'operation' => string 'require' (length=7) 'op_type' => int 8 'filename' => string 'c.php' (length=5) 'opened_path' => string '/var/www/inclued/c.php' (length=22) 'fromfile' => string '/var/www/inclued/b.php' (length=22) 'fromline' => int 2 3 => array 'operation' => string 'require_once' (length=12) 'op_type' => int 16 'filename' => string 'd.php' (length=5) 'opened_path' => string '/var/www/inclued/d.php' (length=22) 'fromfile' => string '/var/www/inclued/c.php' (length=22) 'fromline' => int 2 'inheritance' => array empty 'classes' => array empty
Помимо того, что информацию можно получить с помошью inclued_get_data(), как уже было сказано выше, inclued сохраняет схему вызовов в отдельный файл, в формате JSON.
Сохраненный файл можно использовать для построения графиков вызовов. Для это в пакете присутствует скрипт gengraph.php, предназначенный для генерации описания графа на языке DOT, который потом можно визуализировать с помощью Graphviz
Для имеющегося у нас набора файлов график будет выглядеть следующим образом:

В завершение вот моя интерпритация gengraph.php, для генерации графиков «в одно действие».
PS: Помимо графиков подключений файлов inclued умеет строить графики иерархий классов. Но это позже, если кому то будет интересно.
В файле INSTALL описано : “…The extension can be loaded using
extension=inclued.so
inclued.enabled = On…”
Расширение .so, как я понимаю, это компонента только под Unix.
…ибо нету у меня windows’a
Щастливчик, у меня нормальный доступ с полными правами только на комп под Windows.
Использую РНР под Windows, но Inclued, как я понял станет только под Unix.
Почему? На первый взгляд там не должно быть ничего специфичного для unix’а. Тут я ничем помочь не могу, ибо нету у меня windows’a
Использую РНР под Windows, но Inclued, как я понял станет только под Unix. Есть ли способ просмотреть вложеность инклудов под Windows?
Спасибо.
2necromant:
Чтобы определить зависимости файлов, через get_included(required)_files пришлось бы вносить изменения в каждый файл. А тут простой и “легкий” способ.
Основной для меня use case – ведение статистики о частоте использования тех или иных файлов. А потом на основе этой статистики, и зависимостей файлов можно, например, компилировать опкоды.
Собственно можно использовать встроенные методы
http://ua2.php.net/manual/ru/function.get-included-files.php
http://ua2.php.net/manual/ru/function.get-required-files.php
Да и все.
Подскажите, пожалуйста, как, если не через профайлер.
трейс инкладов и из трейса xdebug’а неплохо получается