LoginSignup
11
12

More than 5 years have passed since last update.

PHP7でのXhprof入門

Last updated at Posted at 2017-12-22

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に対応してなかった。。。:sob:
まじか。。
私は時代に取り残されたライブラリを学ぼうとしているのか。
そこでさらに調べたら公式ではないけれど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_htmlxhprof_libをプロファイリングしたいアプリケーションのドキュメントルート以下に置く。
/xhprof_htmlで画面が表示されれば成功。

xhprof1.png

まだ何も計測していないので何も表示されませんね。

プロファイリング

ここからは実際のプロファイリング。
アプリケーションで最初に読み込むファイルに以下のコードを追加する。

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をリロードする。

xhprof2.png

詳細を確認すると、

xhprof3.png

どの関数にどれくらい時間がかかっているか、CPUやメモリはどのくらい使っているかがわかる。
CPUとメモリのプロファイル情報を表示するにはXHPROF_FLAGS_CPUXHPROF_FLAGS_MEMORYが必要となる。
しかし行のどれかをクリックしても警告が出てしまったの。そこは修正しないと。
ただ、まだ読みづらい。
もっとわかりやすくするためにグラフ化する。

プロファイル情報のビジュアライズ

Graphvizをインストール。

$ yum install graphviz

"View Full Callgraph"をクリックすると関数呼び出しの流れが描かれた巨大なコールグラフが表示される。

xhprof4.png

赤くなっている箇所がボトルネック。

まとめ

関数の呼び出し回数もわかるので、無駄なループ処理を見つけるには便利だと思う。
ただ、どんなSQLが実行されたかはわからないのでそれは別のツールを使うしかなさそう。
とりあえず、コールグラフを出してボトルネックを探して修正という流れはチューニングしてるぜ感が出まくるのでモチベーションは上がりますね:thumbsup_tone2:

参考

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

11
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
12