MacにPHPのプロファイラXHProfをHomebrewでインストールする

以前にLinux(CentOS)にXHProfをインストールする方法を紹介しました。

XHProfはPHPの実行状況を可視化するためのプロファイリングツールです。

今回Macの開発環境に入れてみようと思ってやってみて無事出来たので、インストール方法を紹介ます。

Homebrewインストール

今回はHomebrewを使ってインストールします。HomebrewはMac用のパッケージ管理ツールです。

インストールされていない場合は下記コマンドでインストールしておいて下さい。

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

※ コマンドは本家サイトから貼り付けた方がいいと思ふ。

autoconf・gts・graphvizインストール

Homebrewでautoconf・gts・graphvizをインストールします。autoconfはXHProfのインストール段階で必要で、gts・graphvizはXHProfの機能の処理の流れを画像表示してくれるcallgraphで必要になります。

brew install autoconf
brew install gts
brew install graphviz

それぞれが具体的になんなのかっていうのはググればいいと思います。

autoconfはインストールした後に.bash_profileに下記行を追加しておきましょう。

export PHP_AUTOCONF="/usr/local/bin/autoconf"
export PHP_AUTOHEADER="/usr/local/bin/autoheader"

XHProfインストール

で、次にお目当てのXHProfをインストールします。

デフォルトではXHProfのFormulaファイルは無いので自作します。

require 'formula'

class Xhprof <Formula
  url 'https://pecl.php.net/get/xhprof-0.9.4.tgz'
  sha256 '002a2d4a825d16aeb3017c59f94d8c5e5d06611dd6197acd2f07fce197d3b8f8'

  depends_on 'pcre'

  def install
    Dir.chdir "xhprof-#{version}/extension" do
      system "phpize"
      system "./configure", "--prefix=#{prefix}"
      system "make"
      prefix.install %w(modules/xhprof.so)
    end
    Dir.chdir "xhprof-#{version}" do
      prefix.install %w(xhprof_html xhprof_lib)
    end
  end

  def caveats; <<-EOS.undent
    XHProfのインストールが完了しました。
    php.iniに下記設定を追加してWEBサーバーを再起動して下さい。
    ----
    [xhprof]
    extension="#{prefix}/xhprof.so"
    xhprof.output_dir="/tmp"
    ----
    EOS
  end
end

このあたりを参考にしました。

Formulaファイルの作成が完了したら下記コマンドでインストール。

brew install xhprof

インストール完了時に以下の様に表示されたと思います。

XHProfのインストールが完了しました。
php.iniに下記設定を追加してWEBサーバーを再起動して下さい。
----
[xhprof]
extension="/usr/local/Cellar/xhprof/0.9.4/xhprof.so"
xhprof.output_dir="/tmp"
----

ということで、php.iniに上記設定を追加してやります。

[xhprof]
extension="/usr/local/Cellar/xhprof/0.9.4/xhprof.so"
xhprof.output_dir="/tmp"

xhprof.output_dirは任意の場所でいいですが、今回は/tmpにしました。ここにプロファイル結果ファイルが保存されるようになります。

2015年7月21日追記: 当初xhprof.output_dirの場所を”/tmp/xhprof”にしていましたが、再起動後にフォルダごときえてしまってエラーになったので、ただ単純に”/tmp”を指定するようにしました。プロファイルデータはずっと保存しておきたい場合は別の場所を指定するのがいいでしょう。

プロファイルビューアへのバーチャルホスト設定

XHProfににはプロファイル結果のビューアがついています。/usr/local/Cellar/xhprof/0.9.4/xhprof_html/の中身がそれです。

バーチャルホストにビューアへの設定を追加しておけば結果の確認が楽です。

<VirtualHost *:80>
    ServerName xhprof.local
    DocumentRoot /usr/local/Cellar/xhprof/0.9.4/xhprof_html
</VirtualHost>
<Directory /usr/local/Cellar/xhprof/0.9.4/xhprof_html >
    Options Indexes FollowSymLinks Includes ExecCGI
    AllowOverride All
    Require all granted
</Directory>

hostsファイルにもホスト設定を追加します。

127.0.0.1       xhprof.local

ひと通りここまで作業が完了したらWEBサーバーを再起動しましょう。

プロファイリングのコードを埋め込む

ここまで準備が完了したら実際にPHPにプロファイリング用のコードを埋め込みます。

<?php
// プロファイリング開始
xhprof_enable();

/*
プロファイリングしたい処理
・
・
・
*/

// プロファイリング終了
$xhprof_data = xhprof_disable();
// プロファイリングデータの書き出し
$XHPROF_ROOT = "/usr/local/Cellar/xhprof/0.9.4";
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();
$source = 'source_name';
$run_id = $xhprof_runs->save_run($xhprof_data, $source);

上記実行すると、プロファイリングデータが/tmp/xhprofに保存されます。このデータはバーチャルホストで設定した下記URLで確認できます。

http://xhprof.local

プロファイリング結果へのビューアへ直接移動するにはプロファイリングデータを書きだした後に下記コードを埋め込むことででリンクが作成されます。

echo "<a href=\"http://xhprof.local/index.php?run=$run_id&source=$source\">xprof viewer</a>";

またスクリプト全体をプロファイリングしたい場合、以下のスクリプトだとの先頭にコードを埋め込むだけでいいので便利です。

<?php
// プロファイル開始
xhprof_enable();
// スクリプト完了後に呼び出し
register_shutdown_function(function()
{
    // プロファイル終了
    $xhprof_data = xhprof_disable();
    // プロファイリングデータの書き出し
    $XHPROF_ROOT = "/usr/local/Cellar/xhprof/0.9.4";
    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();
    $source = 'source_name';
    $run_id = $xhprof_runs->save_run($xhprof_data, $source);
    // プロファイル結果へのリンクを作成
    echo "<a href=\"http://xhprof.local/index.php?run=$run_id&source=$source\">xprof viewer</a>";
});

構築は意外と簡単

最初に思っていたよりも意外と簡単にXHProfの環境が構築出来ました。これでボトルネック潰して行くぜ!!

コメントを残す