xdebugとwebgrindを用いたphpのプロファイリング
webページとかDB高速化の話を最近よく見ますね。
最近自分もページ表示の高速化を行っていたのですが、その中で、
phpで行ったxdebugとwebgrindを組み合わせたチューニング方法がとても簡単で便利だったので、やり方をメモしておきます。
php-pecl-xdebugのインストール
まず、xdebugのインストールpeclで提供されていて、パッケージが提供されているので、以下でインストール
$yum install php-pecl-xdebug
xdebug.ini(設定ファイル)の変更
その次に設定ファイルを変更します。
$vim /etc/php.d/xdebug.ini ; Enable xdebug extension module zend_extension=/usr/lib/php/modules/xdebug.so ; "以下が今回追加した箇所" ; debug結果をファイルに書き込む xdebug.profiler_enable=1 ; より詳細にdebugしたい場合 xdebug.profiler_enableかどちから ;xdebug.profiler_enable_trigger=1 ; 結果のファイルの保存先 (default:tmp) xdebug.profiler_output_dir=/tmp
設定の詳細は以下のページを参考に
Xdebug:Documentation
apacheの再起動
これで、xdebugの設定は完了です。apacheを再起動して適当なphpファイルを配置して、アクセスするとtmp以下に、以下のようなファイルができていると思います。
/tmp/cachegrind.out.~
デフォルト設定だと、cachegrind.out.~というファイル名ですが、これを変更したい場合は、
xdebug.profile_outputname
という値を変更します。
ただ中身を見てみても内容がよくわかりません。
$cat /tmp/cachegrind.out.~ $ cat /tmp/cachegrind.out.~ version: 0.9.6 cmd: /var/www/html/phpinfo.php part: 1 events: Time fl=php:internal fn=php::phpinfo 3 3566 fl=/var/www/html/phpinfo.php fn={main} summary: 3629 0 63 cfn=php::phpinfo calls=1 0 0 3 3566
ここで、webgrindというツールを用いて、より簡単にこの結果を確認してみます。
webgrindの導入
まず、webgrindを以下のサイトからダウンロードします。
webgrind Project Hosting on Google Code
DocumentRoot以下に配置
今回は、以下のように保存しました。
/var/www/html/webgrind/
config.phpの編集
その後、解凍したファイルの中のconfig.php内の以下の変数をxdebugの出力先のパスに変更するのですが、デフォルト値が/tmpなので、今回は特に変更しません。
/var/www/html/webgrind/config.php
あとは、webgrind/index.phpにアクセスするだけで、以下のように結果が出力します。
今回は、phpinfo()しかしていないので、あまり意味はなく感じますが、関数単位で、実行時間が測れるのでとても便利ですね。
xdebugだけでも、とても便利な使い方があるので、色々とやってるといいですね。
Xdebugを導入してみる - JavaのStackTraceが欲しい!
xdebugが有効の時は、実行速度が落ちるので、チューニングが終わったら、xdebug.iniをコメントアウトして、xdebugを無効にしましょう。
今回、意外にdateの処理が時間がかかっている事に驚きました。引数の場合にもよるけど、すべての関数にどのくらいの時間がかかっているか簡単に見てみたいな。