PHP
Cytoscape
Callgraph
profile

PHPプロファイルを解析してDBを含めて影響調査を簡単に行う(Cytoscape)

やりたいことは、特定のソース、テーブルを修正したら、どこをテストしたり影響を考慮したらよいのか?

一発で「ココガ影響シマス」ってだしてくれたら幸せ

データも含めてコールグラフがみたい

  • メソッドを修正したときに何処に影響するのかサクサクしらべて、ポイントを明確にしたら便利
  • 既存のプロファイル解析ツールにはXHProf、KCacheGrind、WinCacheGrindなどがあるが・・・コードに仕掛けをしたり、プロファイル毎にしか解析できない。もしかしたら他に方法があるのかもしれないが見つからなかった
  • プロファイルの重ね合わせができない!重ね合わせてみたい
  • 既存のツールでは解析がプロファイル単位なのでファイル名がどのイベントなのか管理しなければならない
  • grepつかって調査して・・・なんて面倒なことから解放されたい

いろいろやってみた結果

こんなことができるようになったよ

item_call.PNG
↑画像はitemテーブルをコールするメソッドを表示したもの。
ここまではgrepで似たようなことはできる
画像のメソッド名は隠ぺいのためにコード[12c3]にしてますが実際はgetXXXXitemXXXのような感じです。

item_call_up.PNG
↑さらにメソッドを上がった画像
これをgrepでやるのはつらい。
IDEでもできない。
画像のメソッド名は隠ぺいのためにコード[12c3]にしてますが実際はgetXXXXitemXXXのような感じです。
色分けはクラスのネームスペースや種類で適当に分けている。
赤色はイベント発生を示す色で、ITEMテーブルに影響している
イベントは4つあることが分かる

以下やったこと

前提

  • PHP 5.5(古い)他のバージョンで同じことができるかわからない
  • 自動テストでカバレッジを高くしておかないとそもそもプロファイルが取れない

プロファイルを理解して解析する

  • xdebugのバージョンによってフォーマットがことなるので注意です。
  • xdebugとフォーマットのバージョンが記入されていて、定義>コール>定義>コールが規則的に書かれている(多いときは1Gバイトくらいになる)。
  • 解析したデータはMYSQLに保存することで、いくつものファイルを重ね合わせて保管。一度取り込んでしまえば・・・その後はプロファイルが不要になる。

テーブル(データベース)もコールグラフに含めたい

  • メソッド>テーブルの関係を求めたら便利そう。
  • SQLの解析をおこないテーブルを持ってくる必要があるので、PDOに出力しているSQLを自作のプロファイルに記録する。
  • PDOそのものを使っている場合はとても面倒くさいが、ラッパー関数をつかっている場合は数行追加するだけ。
  • SQLのプロファイルは解析して関係をMYSQLへ保存する。SQL解析器はたくさんあるので適当に動くものをチョイスすればいい。

MYSQLから検索するツールを作る

以下のようにnode(メソッド、テーブル)を検索するツールを考えた。
- メソッド名、クラス名、文字の一部、ネームスペースで検索して影響元を求める
- 影響元をコールしている要素を再帰的に求めていく>これでテスト対象が網羅
- 影響元がコールしている要素を再帰的に求めていく>これで影響先が網羅
影響調査が一発で漏れなくできるし、必要な情報しかでてこないので余計なコールグラフを見る必要がなくなる。事前解析してMYSQLにデータが保存してあるのでサクサクに動くはず。

検索した結果をみる

  • 結果を効果的に見る方法がなかなかない
  • 検索結果をテキストでみてもイマイチピンとこないので、dot語にかいてグラフ化してみたが、残念な感じ
  • Cytoscapeに読ませてみたらいい感じだったので、Cytoscapeメインで使えるように改良
  • RESTIFが使えるので連携して、検索>表示まで操作を省略できた
  • Cytoscapeがいろんな表現ができるので物によって表現を変えて見やすくすることができるが、ほとんど自己満足の世界。
  • 3Dで表現してみたがイマイチなので諦めた

サンプル

oome.PNG
オーガニックな配置
赤色がイベントで、緑がテーブル、黄色がビジネスロジック、紫?がデータアクセス

kaisou.PNG
階層構造配置

感想

だいまんぞく