Table of Contents
Xdebug
Xdebugはご存知の方も多いと思いますが、デバッグと開発を支援するPHPの拡張機能です。
今回はサクッと試したいので phpenvにて試してみます。
phpenvだとデフォルトでxdebugがいい感じに動いてくれます。
phpenvはこちらの記事でも触れてますのであわせて御覧ください。
プロファイリング実行
Profilingのページに書いてますが
以下の設定でプロファイリング出来ます。
xdebug.mode=profile
xdebug.output_dir=/tmp/xdebug
xdebug.mode
でKCacheGrindなどのツールを使用して
パフォーマンスのボトルネックを分析できるプロファイリングを有効にします。
xdebug.output_dir
でトレース、プロファイリング、ガベージコレクションの統計を
書き込むディレクトリを指定します。
このディレクトリは、PHPを実行しているシステムユーザーが書き込み可能である必要があります。
xdebug.mode=profile
の時は xdebug.start_with_request
がdefaultでONになり
常にプロファイリングが走ることになり、動作が遅くなります。
Request毎にどうするかを切り替えたい場合は xdebug.start_with_request=trigger
にして
$_ENV
、 $_GET
、 $_POST
、 $ _COOKIE
のいずれかにXDEBUG_TRIGGER
の存在を確認して動作するようです。
この状態でPHPを実行すると cachegrind.out.%p
という名前のファイルが出力ディレクトリに吐かれます。
このファイルを分析していくのですが、人が見てもとても理解しづらいので解析ツールを使います。
Webgrind
Webgrindは、PHPのXdebugプロファイリングのWebフロントエンドです。
GitHubからCloneしてきて、index.phpを php -S 0.0.0.0:8080 index.php
しちゃうか、 Dockerを使えば良いです。
docker run --rm -v /path/to/xdebug/files:/tmp -p 80:80 jokkedk/webgrind:latest
index.phpをserveする時は、同じディレクトリないにある config.php
内に以下のような設定がありますので
2系の設定である xdebug.profiler_output_dir
を xdebug.output_dir
に合わせてしまえば大丈夫です。
/**
* Directory to search for trace files
*/
static function xdebugOutputDir() {
$dir = ini_get('xdebug.profiler_output_dir');
if ($dir=='') // Ini value not defined
return realpath(Webgrind_Config::$profilerDir).'/';
return realpath($dir).'/';
}
すると、ServeしているPHPにて対象のプロファイリングの状況が確認出来るようになります。
画像の場合、quicksortにコストが掛かっているのがわかります。
図式化
graphvizを入れておけば、よりわかりやすくビジュアライズすることも出来ます。
対象ファイルを選び、graphvizした状態でShow Call Graph
を押下するだけです。
次はとても簡単な例ですが、フレームワークなどを利用した際に利用するとわかりやすいかと思います。
注意
PHP8のJITを有効化すると、segmentation faultが発生します。 プロファイリング時は素直にOFFにしましょう!
まとめ
今回はPHP8をプロファイリングするツールとして、改めてXdebugと
その描画ツールとしてWebgrindを使ったビジュアライズをご紹介しました。
速度が注目されるPHP8、積極的に速度計測を行ってボトルネックを排除して、
JITで 速
を感じていきたいですね!
明日は タケシ@ インフラエンジニア さんの
【PHP】未経験からエンジニアに転職成功したポートフォリオまとめ【プログラミング初心者向け】
です。
お楽しみに!