Symfony のプロファイラーを触ってみた話

はじめに

このエントリは Symfony Advent Calendar 2014 - Qiita の2日目の記事です。

Symfony のプロファイラーってみなさん活用されてますか?ぼくは、

Symfony を仕事で使うようになって(とはいってもSyfmonyの作業は全体の数%程度)、約半年経ったのですが全然使いこなしていません。SymfonyPHP でははじめてのフレームワークでもあるので基礎的な設計や実装で頭の中がいっぱいになりなかなか目を向けれないような状況でした。でもたまにみてみると、様々な情報が記載されていまして。きっと便利なんだろうな (°°)!いつかはしっかり学ばないと (°°)!という課題意識のみが盛り上がってきている今日このごろです。

ということでSymfony Advent Calendar 2014 - Qiita の2日目はこの盛り上がった課題意識とともにプロファイラーに触れる第一歩を踏み出すところからのプロセスをお楽しみいただければ幸いです。

ということでやったことをつらつらと書いていきます

プロファイラーを知る上での第一歩、ドキュメントを読む

まずドキュメントを読んでみました。Symfony 初心者のぼくにとってはドキュメントを探っていくのも少しばかり大変です。さーっと目を通した限りではこんなところが目につきました。うーん、英語ですね。

プロファイラーを知る上での第二歩、日本語ドキュメントをそっと覗いてみる

英語は苦手ではないのですが、やはり日本語のほうがスーーッと頭に入ってきてしまう。そんなときには日本語ドキュメントを参照します。

しかりながら、プロファイラーの cookbook は翻訳されてないので困ったところ。ここで立ち止まっては真の(日本 Symfony ユーザ会にいつもお世話になっている)男じゃないッ!

プロファイラーを知る上での第三歩、ドキュメントを翻訳する

ということで、おもむろにドキュメントを翻訳してきますね (°_°)!日本語ドキュメントは GitHub で管理されてまして symfony-japan/symfony-docs-ja · GitHub にあります。翻訳活動はプルリクエストベースで行われているので GitHub が使えたらどなたでも翻訳可能でしょう。やりかたは Wiki に記載されてますので要チェックです。今回はこういったプルリクエストで翻訳しました。

プロファイラーを知る上での第四歩、コードを読む

次に実際のコードを読んでいきました。どうやら [src/Symfony/Bundle/WebProfilerBundle][(https://github.com/symfony/symfony/tree/2.7/src/Symfony/Bundle/WebProfilerBundle) が実装コードのようですね。うーん、なんだかよくわかりませんセンパイ!(投げやり)

プロファイラーを知る上での第五歩、触れてみる

さぁそんなこんなでプロファイラーのドキュメントをさーっと見てシャッと翻訳してコードはそっとじしてなんとなく勉強した気分になってきました。Symfony の 2.6.1-DEV をインストールして触ってみます。Composer で Symfony のスタンダード・エディションをサクッと見ていきました。デフォルトで作成されいる AcmeDemoBundle で触れてみたのでそんなに目新しい発見はなかったです。ドキュメントを読んだり翻訳してみたりして知った設定などを試してみました。

プロファイラーについていろいろ調べてみて知ったこと

そんなこんなのファイブステップで自分なりにはそこそこプロファイラーのことが知れました。特に初歩的な設定周りについては新しく知ることが多かったです。いくつかピックアップして紹介します。

プロファイラーを本番機でも使う

デフォルトでは開発環境のみ適応される設定になっています。しかしながら、本番機でも Profiler が使えたら何かと捗りそうですよね。Symfony では build-in matcher を使うことで特定の IP アドレスからのアクセスのみ許可する、パスで特定のURLのみ許可する、といった使い方ができます。

# app/config/config.yml
framework:
    # ...
    profiler:
        matcher:
            ip: 168.0.0.1

詳しい使い方は Recipes about Profiler (The Symfony CookBook) にありますので確認してみてください。

例外が発生したときのみプロファイラーが情報を収集するように制限する

本番機で稼働させた時などオーバーヘッドが気になるシーンでは例外発生したときのみプロファイラーが情報を収集するように制限できるようです。具体的には only_exceptionstrue にすればいいようです。

# app/config/config.yml
framework:
    profiler: { only_exceptions: true }
プロファイラーが集積するコントローラの処理を絞る

さらに only_master_requests というオプションでプロファイルするコントローラの処理を限定できるようです。

# app/config/config.yml
framework:
    profiler: 
        only_master_requests: true
プロファイラーが集積したデータをテストに利用する

Symfony2 のプロファイラ Profiler は、毎回のリクエストに関するたくさんのデータを集めます。このデータを使ってデータベース呼び出しの回数を調べたり、フレームワーク内でかかる時間を調べることができます。 - ファンクショナルテストでプロファイラを使用する方法 | Symfony2日本語ドキュメント

こんな使い方があるなんて。プロファイラーで集積したデータを取り扱うことが簡単にできるみたいで、発想次第でものすごく幸せになれそうな予感。

プロファイラに集積されるデータのストレージを変更する

普段は app/cache/dev/profiler に集積されるデータを MySQL や Redis などのストレージに変更できるようですね。

Switching the Profiler Storage (The Symfony CookBook)

プロファイラーの表示位置を変更する

プロファイラーの表示位置は position というオプションで top, bottom が選択できるようです。

# app/config/config.yml
framework:
    position:
        position: top
プロファイラーを無効にする

enabled というオプションでプロファイラーを無効にできます。

# app/config/config.yml
    profiler:
        enabled: false
プロファイラーに手軽にアクセスできるようになるChrome拡張

こんな Chrome 拡張があるようです。

Give access to Symfoy2 Profiler if any Response from a server is made with the "X-Debug-Token". Very useful for REST & AJAX Development/testing - RiperFr/sf2DebuggerChrome · GitHub

感想

こんな感じでプロファイラーについてドキュメントを眺めてみたり翻訳してみたりしていろいろ触ってみました。プロファイラーを利用することで開発をスムーズに進められるだけでなく、本番機でも動作させたりして障害対応力を向上できたりといろいろと使いどころがありそうですね。今回は、ドキュメント読み→翻訳→エントリ作成、あたりの全工程で 3時間ほどでした。実際にはいろいろと実装もしてみたのですが、ちょっとまとまりつかなくなりそうでしたのでまたの機会にします。ちょっと知識が増えてきたので、実際の開発でも活用して効率のいいプロファイラー・デバックライフを過ごしたいと思います。