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の処理が時間がかかっている事に驚きました。引数の場合にもよるけど、すべての関数にどのくらいの時間がかかっているか簡単に見てみたいな。