[Symfony2]プロファイラーのタイムラインへの独自項目追加方法

Symfony2 では xdebug を導入しなくても、簡易なプロファイラーを利用できます。

"タイムライン"で各処理が消費した時間を見ることができるのですが、コントローラーから呼び出された各処理については自動で時間を取得してはくれません。

Symfonyで提供しているプロファイラーのタイムライン

・・・というわけで独自項目をタイムラインへ追加する方法について調査しました。

タイムラインへの追加手順は次の通り。

  • タイムラインに追加したい処理を行うオブジェクトに "debug.stopwatch" を DI
  • $stopWatch = $this->get('debug.stopwatch'); $event = $stopWatch->start('hogehoge'); ...(任意の処理)...; $event->stop()
こんな感じになります
残念ながらドキュメントにはこのあたり書いてないのですよね。。。

以下、調査メモ


StopWatch コンポーネント

https://github.com/symfony/symfony/tree/51c6d7696c2fb98f7720d842c502662e6451f925/src/Symfony/Component/Stopwatch

各コンポーネントの時間の集計についてはこちらの StopWatch を利用している模様。
時間を取得するコンポーネントから利用して、プロファイラに渡す必要がありそう。

TraceableEventDispatcher コンポーネント

https://github.com/symfony/symfony/blob/master/src/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php#L125

StopWatch の利用はこんな感じの模様。
$event = $stopWatch->start();
...
$event->stop();
プロファイラにデータを渡す部分は見えないが、恐らく StopWatch は DI でセットされるので、同様に Symfony がサービスとして用意してくれている StopWatch サービスを利用すれば問題なさそう。

StopWatch サービス定義

https://github.com/symfony/symfony/blob/2.4/src/Symfony/Bundle/FrameworkBundle/Resources/config/debug.xml#L15

"debug.stopwatch" という id で定義している。

データコレクター定義

https://github.com/symfony/symfony/blob/2.4/src/Symfony/Bundle/FrameworkBundle/Resources/config/collectors.xml#L46

やはり "debug.stopwatch" を DI している。
データコレクターについては詳しくはこちら

その他

Propel や Doctrine では StopWatch を Logger 中で扱っているようです。
実際に使う場合の実装としてはこの方法のほうが扱いやすいかも。
https://github.com/symfony/symfony/blob/2.4/src/Symfony/Bridge/Doctrine/Logger/DbalLogger.php
https://github.com/doctrine/DoctrineBundle/blob/master/Resources/config/dbal.xml#L31

コメント

このブログの人気の投稿

PostgreSQLで多次元配列を1次元配列に展開したい

React で input 要素に focus したい話

inotify でファイル監視しようず!