TL;DR
PHP7でもXhprofはなんとか使える。
PHPのプロファイリングについて
調べるとXdebugとXhprofが主流らしい。
今回はFacebook謹製のXhprofを使ってみる。
peclでインストールできる。
$ pecl install channel://pecl.php.net/xhprof-0.9.4
はずなのだが自分の環境は複数バージョンのPHPが存在していてpeclがうまく動いてくれなかったのでソースコードからインストール。
$ wget http://pecl.php.net/get/xhprof-0.9.4.tgz
$ tar zxvf xhprof-0.9.4.tgz
$ cd xhprof-0.9.4/extension/
$ phpize
$ ./configure
$ make
$ make test
$ sudo make install
でいけるはずなのだがコンパイルで失敗する。
何故何故と調べたらPHP7に対応してなかった。。。
まじか。。
私は時代に取り残されたライブラリを学ぼうとしているのか。
そこでさらに調べたら公式ではないけれどPHP7対応版が見つかったのでそれを試してみることに。
$ git clone git@github.com:Yaoguais/phpng-xhprof.git xhprof
$ cd xhprof
$ /path/to/php7/bin/phpize
$ ./configure --with-php-config=/path/to/php7/bin/php-config
$ make
$ make test
$ sudo make install
すんなりインストール成功。
php.iniに以下を追加。
[xhprof]
extension=phpng_xhprof.so
xhprof.output_dir="/var/log/xhprof"
ログディレクトリを作成。
$ mkdir /var/log/xhprof
$ chmod 777 /var/log/xhprof
Apacheを再起動して確認。
$ php -i | grep xhprof
xhprof
xhprof => 0.9.5
オーケーですね。
PHP7対応版ではない公式のほうのソースコードに含まれているxhprof_html
とxhprof_lib
をプロファイリングしたいアプリケーションのドキュメントルート以下に置く。
/xhprof_html
で画面が表示されれば成功。
まだ何も計測していないので何も表示されませんね。
プロファイリング
ここからは実際のプロファイリング。
アプリケーションで最初に読み込むファイルに以下のコードを追加する。
require_once dirname(__FILE__) . '/xhprof_lib/utils/xhprof_runs.php';
function __xhprof_save()
{
$data = xhprof_disable();
$runs = new XHProfRuns_Default();
$runs->save_run($data, 'sample-application');
}
xhprof_enable(XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY);
register_shutdown_function('__xhprof_save');
そしてどこかにアクセスするとプロファイル情報が保存される。
xhprof.output_dir
で設定しているディレクトリを確認するとファイルが作られていることがわかる。
ブラウザで/xhprof_html
をリロードする。
詳細を確認すると、
どの関数にどれくらい時間がかかっているか、CPUやメモリはどのくらい使っているかがわかる。
CPUとメモリのプロファイル情報を表示するにはXHPROF_FLAGS_CPU
とXHPROF_FLAGS_MEMORY
が必要となる。
しかし行のどれかをクリックしても警告が出てしまったの。そこは修正しないと。
ただ、まだ読みづらい。
もっとわかりやすくするためにグラフ化する。
プロファイル情報のビジュアライズ
Graphvizをインストール。
$ yum install graphviz
"View Full Callgraph"をクリックすると関数呼び出しの流れが描かれた巨大なコールグラフが表示される。
赤くなっている箇所がボトルネック。
まとめ
関数の呼び出し回数もわかるので、無駄なループ処理を見つけるには便利だと思う。
ただ、どんなSQLが実行されたかはわからないのでそれは別のツールを使うしかなさそう。
とりあえず、コールグラフを出してボトルネックを探して修正という流れはチューニングしてるぜ感が出まくるのでモチベーションは上がりますね
参考
https://qiita.com/morisuke/items/49f17bda2c764ae8f725
https://qiita.com/w_cota/items/48667a845cd06d969d4a
https://quartet-communications.com/info/topics/12238
これを書いている途中に見つけたTidewaysはどうなのだろう。
開発は活発そうだがGitHubのステータスがビルド失敗になっているのが不安だ。。
https://github.com/tideways/php-profiler-extension