openSUSEにPHPプロファイラー:xhprofインストール

タグ: OpenSUSE   Laravel4  

最近も、やれLaravelの効率がどうのこうのという話が流されます。まあ、現状Composerに乗り、「車輪の再発明」を避ける用に開発されているLaravelは、その方針から、どうしても外部ライブラリーに頼ることになり、動作に必要なコンポーネントを自ら実装するフレームワークに対し、効率の面で劣ってしまうのは、致し方ない部分です。現状、Laravelを試すだけでなく、実際に使用している人たちは、そうした面を理解し使用しているのですから、今更感があります。

とはいえ、Laravel4になってから、全体の実行プロファイリングの結果を見ていなかったので、現在開発している個人プロジェクトで、どんな結果になるか見てみようと思いました。

そう言えば、コーリンググラフを出してくれるものがあったなと、xhprofを思い出し、現在使用しているopenSUSE13.1で動かしてみることにしました。

インストール

公式リポにはなかったので、ブラウザからソフトウェア検索で探します。すると個人ユーザーの方で、ビルとを公開している方が二名いたので、それを使わせてもらいました。ワンクリックインストールで完了です。

後は自分のディレクトリーにworksという作業ディレクトリーを作成し、以下の2ディレクトリーをコピーしておきます。

  • /usr/share/php5/xhprof/xhprof_html
  • /usr/share/php5/xhprof/xhprof_lib

今回、私の環境では、動作に必要なGraphvizというパッケージが予め入っていました。インストールしていない場合は、導入しておく必要があります。

設定

/etc/php5/conf.d/xhprof.iniが設定ファイルです。その中の出力ディレクトリーを自分の作業ディレクトリーにコピーした、xhprof_htmlに設定します。

xhprof.output_dir=/home/hiro/works/xhprof_html

仮想ホスト

仮想ホストを上記で設定したディレクトリーへアクセスするように、設定します。

今回はxhprofというドメイン名で、前記ディレクトリーへアクセスするように設定しました。

index.phpの変更

Laravelのpublicフォルダーにある、index.phpを以下のように変更します。

<?php
xhprof_enable();    // start profiling

require __DIR__.'/../bootstrap/autoload.php';
$app = require_once __DIR__.'/../bootstrap/start.php';
$app->run();

$xhprof_data = xhprof_disable(); // end profiling

$XHPROF_ROOT = '/home/hiro/works';
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";

$xhprof_runs = new XHProfRuns_Default();

$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof");

echo "<a href=\"http://xhprof/index.php?run=$run_id&source=xhprof\">プロファイル結果</a>";

後は、通常通りにページを表示すれば、最後に結果を確認するためのリンクが表示されます。

セッションごとに500Kほどのファイルがxhprof_htmlディレクトリーに作成されますので、こまめに削除しましょう。

結果は?

特定の重い処理を何度も呼び出しているような、典型的なボトルネックではなく、やはり様々なクラスを呼び出しているがための、重さでしょう。

コーリンググラフを張ることも、ちょっと思い浮かんだのですが、環境が違えば、結果も異なり、Hello Worldだけのものや、実用的なDBアクセス+認証処理なんかじゃ、そりゃ異なります。公開することに意義がないので止めました。重いですしね。グラフは。

そもそも、今回の結果は開発環境のSSD上で行いましたが、HDではまた変化するでしょうし、ストレージがDBなのか、オンラインサービスか、オンメモリか、compiled.phpを作っているか、いないか、はたまた…とバリエーションも多いですので、やはり意味が見いだせませんでした。もうちょっと、実用的な記事を考えています。