ポンコツエンジニアのごじゃっぺ開発日記。

いろいろポンコツだけど、気にするな。エンジニアの日々の開発などの記録を残していきます。 自動で収入を得られるサービスやシステムを作ることが目標!!

【PHP】PHP7.4 + docker + XHProf の環境を整えてボトルネックを見つけよう!

今回は、ローカル環境でのパフォーマンス計測をしたいなと思いました。 そこで、タイトルの通り、今回はPHP7環境(本記事ではPHP7.4環境で行うが、PHP7.3やPHP7.2, PHP7.1, PHP7.0もきっと同じ感じだと思う)でdocker-composeを使ってローカル環境を整えたところでXHProfを使いたいなと思います。

といことで早速環境構築をしていきたいと思います。

PHP7でのXHProfのインストール

XHProfはfacebookが開発したPHP用のプロファイラですが、PHP7では動かないようです。(試してない) そこで、今回はPHP7対応したYaoguais/phpng-xhprofを利用させていただきました。

不要なものがあるかもですが、Laravelを動かす環境を想定して、以下のようなDockerfileを用意しました。

FROM php:7.4.6-fpm
ENV TZ=Asia/Tokyo
RUN apt-get update && apt-get install -y --no-install-recommends libicu-dev git unzip zlib1g-dev libzip-dev libonig-dev libgmp-dev graphviz


WORKDIR /root/
RUN git clone https://github.com/tideways/php-profiler-extension.git
WORKDIR /root/php-profiler-extension
RUN phpize
RUN ./configure
RUN make
RUN make install
RUN echo 'extension=tideways_xhprof.so' >> /usr/local/etc/php/conf.d/tideways.ini
RUN echo 'tideways.auto_prepend_library=0' >> /usr/local/etc/php/conf.d/tideways.ini

RUN mkdir /tmp/xhprof
RUN chmod 777 /tmp/xhprof/

WORKDIR /var/www
CMD php-fpm
RUN chown www-data:www-data /var/www/

参考:tideways_xhprofでプロファイル(Docker編) - tsyama記

また、コールグラフ生成のため、graphvizをapt-getに含めています。

参考:PHP7環境でXHProf導入 : エキサイト公式 エンジニアブログ

上記のDockerfileでphpという名前のコンテナを実行します。

xhprof付属の表示ツールのインストール

上記の対応を記録を残す準備はできました。 次は、残したログから、プロファイル結果を見るための準備をします。

コンテナに入ります。

$ docker-compose exec php bash

コンテナ内で、以下のcomposerコマンドを叩きます。

$ composer require facebook/xhprof dev-master

生成されたvendorディレクトリ以下に、xhprofを表示するためのスクリプトが存在するので、それを利用します。ここではLaravelやCodeIgniterなどのフレームワークを想定していて、publicディレクトリが存在することを前提としています。

そのため、以下のように、publicディレクトリから参照できる、すなわちブラウザからアクセスすれば実行できるような状態にします。

$ cp vendor/facebook/xhprof/xhprof_html public/ -rf
$ cp vendor/facebook/xhprof/xhprof_lib public/ -rf

以下の記事のように、シンボリックリンクでも良いはずです。(というか、そちらのほうがよいのかも)

blog.excite.co.jp

計測ポイントの設定

最後に、計測するために、以下のスクリプトを差し込みます。

例えば、Laravelとかだとindex.phpに以下のように入れれば良いと思います。

tideways_xhprof_enable();  // 計測開始

$app->run();  // メイン処理

$data = tideways_xhprof_disable();  // 計測終了
$filename = '/tmp/' . intval(microtime(true)) . mt_rand(1,10000) . '.xhprof.xhprof';  // 計測結果を保存する
file_put_contents($filename, serialize($data));

ファイル名の最後が.xhprof.xhprofとなっていますが、なぜか、.xhprofとするとエラーになってしまうので、こうしています。

計測結果を確認する

とうとう準備が整いました。 後はアクセスするだけです。 ローカル環境だとhttp://localhost:8080/xhprof_html/のようなURLにアクセスすれば確認できると思います。

f:id:ponkotsu0605:20200825004203p:plain

アクセスがない状態だと、上記のようにプロファイリング結果が存在しませんが、アクセスしてみると以下のようにファイルが作成されます。

f:id:ponkotsu0605:20200825004647p:plain

このリンクにアクセスすることで、結果を見ることができます。

また、コールグラフを確認すると、以下のようなグラフでわかりやすくボトルネックを探す手助けを確認することができます。

f:id:ponkotsu0605:20200825004858p:plain

さいごに

これで、簡単にローカル環境でAPMの導入と言っていいのかわかりませんが、XHProfの導入ができました。

お問い合わせプライバシーポリシー制作物