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.php

array
'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 умеет строить графики иерархий классов. Но это позже, если кому то будет интересно.

Несколько комментариев

  1. Alexander пишет:

    В файле INSTALL описано : “…The extension can be loaded using
    extension=inclued.so
    inclued.enabled = On…”
    Расширение .so, как я понимаю, это компонента только под Unix.

    …ибо нету у меня windows’a :)
    Щастливчик, у меня нормальный доступ с полными правами только на комп под Windows.

  2. Станислав пишет:

    Использую РНР под Windows, но Inclued, как я понял станет только под Unix.
    Почему? На первый взгляд там не должно быть ничего специфичного для unix’а. Тут я ничем помочь не могу, ибо нету у меня windows’a :)

  3. Alexander пишет:

    Использую РНР под Windows, но Inclued, как я понял станет только под Unix. Есть ли способ просмотреть вложеность инклудов под Windows?
    Спасибо.

  4. Станислав пишет:

    2necromant:

    Чтобы определить зависимости файлов, через get_included(required)_files пришлось бы вносить изменения в каждый файл. А тут простой и “легкий” способ.

    Основной для меня use case – ведение статистики о частоте использования тех или иных файлов. А потом на основе этой статистики, и зависимостей файлов можно, например, компилировать опкоды.

  5. Necromant пишет:

    Собственно можно использовать встроенные методы
    http://ua2.php.net/manual/ru/function.get-included-files.php
    http://ua2.php.net/manual/ru/function.get-required-files.php
    Да и все.

  6. Станислав пишет:

    Подскажите, пожалуйста, как, если не через профайлер.

  7. Weirdan пишет:

    трейс инкладов и из трейса xdebug’а неплохо получается

Оставить комментарий