Xdebug + VimでPHPのWebアプリをステップ実行してみた

PHPerの強力な味方var_dump。
しかし、あまりにもvar_dumpにばかり頼っていると、「えーマジvar_dump?」「var_dumpデバッグが許されるのは小学生までだよねー」などと罵られかねません。
そこで、今回は脱var_dumpデバッグを目指し、Xdebug + VimPHPのWebアプリをステップ実行してみます。

環境

OS Mac OS X 10.6.8
PHP 5.3.15
Vim 7.3

debugger.vimのインストール

下記サイトからdebugger.zipをダウンロードします。

http://www.vim.org/scripts/script.php?script_id=1929

ダウンロードしたdebugger.zipを.vimディレクトリに展開します。

$ cd ~/.vim
$ unzip ~/Downloads/debugger.zip 

これでdebugger.vimのインストールは完了です。

debugger.vimが起動することを確認します。
まず、ファイル名の指定なしでVimを起動します。

$ vim

Vimが起動したら、fn + F5を押します。

waiting for a new connection on port 9000 for 5 seconds...

というメッセージが出力され9000ポートでListenが始まればインストールはOKです。

もしListenが始まらない場合は、VimPythonインタフェースが有効になっていない可能性があります。
下記コマンドでPythonインタフェースが有効になっているか確認します。

$ vim --version | grep python
 +persistent_undo +postscript +printer -profile -python -python3 +quickfix

「+python」となっていれば有効になっています。
「-python」となっている場合は有効になっていないので、Vimを再インストールする必要があります。

下記コマンドでVimをアンインストール。

$ sudo port clean vim

そして「+python27」オプションをつけてVimを再インストール。

$ sudo port install vim +python27

インストールが終わるまで時間がかかるので、コーヒーでも飲みながら待っていてください。

インストールが終わったら、Pythonインタフェースが有効になっていることを確認します。

$ vim --version | grep python
 +python -python3 +quickfix +reltime -rightleft +ruby +scrollbind +signs 
リンク: /usr/bin/gcc-4.2   -L. -L/opt/local/lib      -L/opt/local/lib -arch x86_64 -o vim       -lncurses -liconv -lintl -framework Cocoa    -L/opt/local/lib  -fstack-protector  -L/opt/local/lib/perl5/5.12.4/darwin-thread-multi-2level/CORE -lperl -lm -lutil -lc -L/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config -lpython2.7 -framework CoreFoundation -u _PyMac_Error /opt/local/Library/Frameworks/Python.framework/Versions/2.7/Python   -lruby -lobjc  -L/opt/local/lib

今度はOKです。
再度Vimを起動してfn + F5を押してみてください。
今度はListenが始まるはずです。

Xdebugのインストール

Peclで一発で入ります。

$ sudo pecl install xdebug

インストールできたことを確認します。

$ pecl list
Installed packages, channel pecl.php.net:
=========================================
Package Version State
xdebug  2.2.1   stable

次に、php.iniにXdebugの設定を追記します。

[Zend]
zend_extension=/usr/lib/php/extensions/no-debug-non-zts-20090626/xdebug.so

[Xdebug]
xdebug.default_enable = true
xdebug.remote_enable = true
xdebug.remote_host = localhost
xdebug.remote_port = 9000
xdebug.remote_connect_back = false
xdebug.remote_cookie_expire_time = 3600
xdebug.remote_handler = dbgp
xdebug.remote_log = /var/tmp/xdebug.log

設定が有効になっていることを確認します。

$ php -r "phpinfo();" | grep -i xdebug

Xdebug関連の設定がずらずらと表示されれば、とりあえず設定はOKです。

ステップ実行

下記のサンプルプログラムをステップ実行してみます。

index.php

<?php
$food = array(
         'Japanease' => 'Sushi',
         'Italian'   => 'Pizza'
        );

$nation = 'Japanease';

echo "I love $nation[$food]. Because I am $nation.";

上記のindex.phpApacheのドキュメントルートに配置してください。

Vimを起動して9000ポートでListenしている状態で、http://$HOSTNAME/index.php?XDEBUG_SESSION_STARTにリクエストを送信します。
URLに?XDEBUG_SESSION_STARTをつけないとApacheXdebugを使用してくれないので注意してください。

リクエストを送信すると、デバッガが起動します。

fn + F3でステップ実行できます。

fn + F5でプログラムを最後まで実行すると、
ブラウザに「I love Sushi. Because I am Japanease.」と表示されます。

今度はブレークポイントを設定してみます。
Vimでindex.phpを開き、9行目にカーソルをあわせて「:Bp」押し、ブレークポイントを設定します。

index.phpを開いたままfn + F5を押してリクエストを送信すると、ブレークポイント付きでデバッガが起動します。

fn + F5で実行すると、ブレークポイントを設定した行でプログラムの実行が停止します。

ここで変数の値を参照してみます。
「,e」と入力すると、カーソルがWATCH_WINDOWに移動します。
「/*{{{1*/ => eval:」と聞かれるので、「$nation;」と入力しエンターを押すと、$nationの値を表示できます。

変数の値を書き換えることも可能です。
「,e」と入力しWATCH_WINDOWに移動したあと、今度は「$nation = 'Italian';」と入力します。
すると、$nationの値を書き換えることが可能です。

この状態でfn + F5を押してプログラムを実行すると、今度はブラウザに「I love Pizza. Because I am Italian.」と表示されます。

まとめ

Xdebug + VimPHPのWebアプリをステップ実行してみました。
これでデバッグ用のvar_dumpを消し忘れて、女の子に「キモーイ」などと罵倒されることもなくなると思います。