PHP アプリのボトルネックの分析に XHProf を使う。
XHProf は PECL 拡張として提供されている。
XHProf のパッケージをダウンロードし、ビルドしてインストールする (pecl コマンド経由のインストールには失敗する)。
基本的には http://mirror.facebook.net/facebook/xhprof/doc.html の手順どおりに実施すればインストールできる。
まず、 http://pecl.php.net/package/xhprof から最新版のパッケージファイルを入手し、展開する:
$ cd /path/to/directory $ wget http://pecl.php.net/get/xhprof-0.9.2.tgz $ tar xvf xhprof-0.9.2.tgz
ビルドをおこなうためのファイル群は、展開後のディレクトリの、 extension ディレクトリに格納されているので、そのディレクトリまで移動して phpize コマンドを実行する:
$ cd /path/to/xhprof-root/extension $ phpize
php-config のバイナリ (php.ini ではない) のパスを configure オプションに指定したうえでビルドをおこなう:
$ ./configure --with-php-config=/path/to/php-config $ make # make install
php.ini を設定し、 XHProf を有効にする。また、ここで、 XHProf のプロファイル結果の出力先を指定する必要がある。 XHProf のプロファイル結果を Web インターフェース等から閲覧する場合、ファイルとして出力されたプロファイリング結果が必要となる。以下に、 php.ini の設定例を示す (以下の例では /tmp 以下にプロファイル結果を出力する):
[xhprof] extension=xhprof.so xhprof.output_dir=/tmp
XHProf が正しくインストールされているかどうか、以下のコマンドを実行して確認する:
$ php -m | grep "xhprof" xhprof
プロファイル結果閲覧用 Web インターフェースは、 XHProf のパッケージに付属している。 xhprof_html ディレクトリ以下のファイルと、 xhprof_lib 以下のファイルである。
xhprof_html と xhprof_lib のディレクトリの構成は動かすことができないので、 Apache のドキュメントルートとして xhprof_html ディレクトリを設定したり、シンボリックリンクを貼るなどして、 xhprof_html ディレクトリ以下をそのまま公開ディレクトリとするのがよい。
準備が整ったら、ブラウザから xhprof_html ディレクトリ内の index.php にアクセスしてページが表示されることを確認する。
OpenPNE3 にプロファイリング用のフロントコントローラを追加する。このフロントコントローラにアクセスした場合のみ、 XHProf のプロファイリングをおこなう。
プロファイリング用フロントコントローラのサンプルは、 http://gist.github.com/412924 から入手することができる。
まず、 OpenPNE3 の web ディレクトリにこのサンプルを設置する:
$ curl "http://gist.github.com/raw/412924/prof.php" > /path/to/OpenPNE3/web/prof.php
設置したフロントコントローラ内の、 $PROF_URL と $XHPROF_ROOT を環境にあわせて書き換える。 Web インターフェースをブラウザで閲覧するための URL を $PROF_URL に、 XHProf のルートディレクトリまでのパスを $XHPROF_ROOT に設定する。
設定が完了したら、このフロントコントローラに対してブラウザからアクセスすると、ページの最下部に以下のような文字列が出力される:
--------------- Assuming you have set up the http based UI for XHProf at some address, you can view run at http://example.com/xhprof/index.php?run=xxxxx&source=xxxxx ---------------
この文字列中の URL に対してアクセスすると、このリクエストのプロファイル結果を閲覧することができる。
非常にいまさらですがこのドキュメントは AS-IS で提供していてアップデートの予定もないです。