今回は、ローカル環境でのパフォーマンス計測をしたいなと思いました。 そこで、タイトルの通り、今回は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
以下の記事のように、シンボリックリンクでも良いはずです。(というか、そちらのほうがよいのかも)
計測ポイントの設定
最後に、計測するために、以下のスクリプトを差し込みます。
例えば、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にアクセスすれば確認できると思います。
アクセスがない状態だと、上記のようにプロファイリング結果が存在しませんが、アクセスしてみると以下のようにファイルが作成されます。
このリンクにアクセスすることで、結果を見ることができます。
また、コールグラフを確認すると、以下のようなグラフでわかりやすくボトルネックを探す手助けを確認することができます。
さいごに
これで、簡単にローカル環境でAPMの導入と言っていいのかわかりませんが、XHProfの導入ができました。