目次
PHP で書かれた、パフォーマンスがクソほど悪い web サイトの様子を見ることになったので、どこに時間使っとんねん!を調べようと思い xhprof 入れるぞ!!と準備しようとしたら PHP7 以降はサポートしないらしい。 FB 社が HHVM に移行したから扱わなくなったのかな?わからん。
調べたら PHP7 対応の更新を独自に追加した xhprof と、 tideways という xhprof 互換のプロファイリングツールがあるらしいので tideways を使ってみる話。
XHProf fork with PHP 7.0, 7.1 and 7.2 support | Tideways
tideways エクステンションの準備
ここからエクステンションがダウンロードできる。tideways/php-xhprof-extension: Modern XHProf compatible PHP Profiler for PHP 7
ちなみにここでタイトル回収なんですけど、こう説明書きされている。
Modern XHProf compatible PHP Profiler for PHP 7 https://tideways.io
Windowsの場合はAppVeyorのアーティファクトからになる。GitHub からもリンクがあるけど、ここ。
php-profiler-extension master.251 - AppVeyor
ここから自分の PHP バージョンを選んで、CI 結果の中から Artifacts があるので、そこに dll が入っている zip がある。
あとは環境を問わず、エクステンションを既存の別のエクステンションと同じディレクトリに入れて php.ini で extension=… を記載を追加して読み込めば良い。
こいつは Windows でやってる。
php -m すると今読み込んでいるエクステンションが確認できるので、このときエラーが出ずに tideways の記載が見えれば準備 OK
注意事項として tideways のツール群を使わない(xhprof相当のことだけローカルでやりたい。tidewaysのインフラを使わない)なら 公式サイトでアナウンスされている yum や apt-get を使ったインストールはしないこと。 そっちだとうまくできないっぽい。
Mission control center for PHP application performance | Tideways
ただ tideways のツール群にのっかると、プロファイリングやアラート通知が出来るよ!と書いてあって非常に便利そう。 ツール群を入れたら自動でプロファイリングして集計して可視化までしてくれる。超便利やん…
tideways の xhprof 互換エクステンションを使ってプロファイリングの実施
GitHub にも書いてあるが、ざっくりとはこういう形。tideways_xhprof_enable();
start_my_application();
$data = tideways_xhprof_disable();
file_put_contents(DIR . “/1.xhprof”, serialize($data));
これで記載したファイルと同じディレクトリに 1.xhprof というファイルが出来上がる。
Laravel や CakePHP なら一番最初に呼ばれる index.php をまるっと囲ってしまうと何も考えずに「どこのページが重たいかな~~フッフ~ン」と楽できる。 楽できる一方で、全ての処理について出てしまうので「特定のページが重いんだよなあ~~」みたいなときには使いにくい。 そのときは個別にやっていくと良さげ。
プロファイリング結果の確認
出力された結果は xhprof と互換性があるので、xhprof を可視化するツールでそのまま見れる。 例えば xhgui がいろいろできて便利そうに見える。perftools/xhgui: A graphical interface for XHProf data built on MongoDB
いろいろ必要なのがあるなあとか、変なところで詰まるのもなあ、と思い、今回はとりあえず結果を見たかっただけなので xhprof に付属する xhprof_html を使った。 xhgui の話はまた今度にする。
ただ、xhprof_html は xhprof の設定が前提となるので、それそのままだと動かない(主にディレクトリ周り)ので、そのあたりを少しいじった。こちらを使いたい方はどうぞ。
sters/xhprof-html: xhprof (or tideways) visualize html tool from xhprof repo.
これを使うとこんな感じの Web ページが見えるようになるので、これでおしまい。
この画面から、どのメソッドが何回呼ばれてどれくらい時間がかかっているかという、PHP アプリケーションのボトルネックが丸見えになってくるので、パフォーマンスチューニングドンドンやっていける。
余談) PHP7 対応された xhprof
これは Travis でぐるぐる CI も回してる。 PHP 7.0 と 7.1 で CI されてるので、そこは確実に使えるっぽい。yaoguais/phpng-xhprof: upgrade xhprof extension to PHP7
使い方は README にも書いてあるとおりで xhprof とまったく同じでいい。エクステンション入れて xhprof_enable() したら良い。 結果は xhprof_disable() すると受け取れるので、それを serialize() して保存すると各種ツールで見れる。