少し前に「MAMPにMTをインストールする際のメモ」という記事を書きましたが、今回はそこで書き忘れたPHPのデバッグ環境の構築について書いてみたいと思います。
MacGDBpのインストール
PHPスクリプトをリモートデバッグするには MacGDBpという、XdebugのGUIフロントエンドを使用します。ダウンロード、アーカイブ展開後、MacGDBp本体をアプリケーションフォルダにコピーするだけです。
Xdebugのインストール
次にサーバ側にXdebugエクステンションをインストールします。XdebugのバイナリパッケージがActiveStateにありますのでこれを利用します。Komodo Debugger Extensionsから"Komodo 5.1 Remote Debugging Packages"の欄にある"PHP Remote Debugging / Mac OS X"をダウンロードし、展開します。
展開するとPHPのバージョンごとにエクステンションがありますので、MAMPで使用しているPHPのバージョン(MAMP 1.7.2の場合はPHP 5.2.6)にあわせてエクステンション(xdebug.so)を選択し、以下の場所へコピーします。
$ cd 5.2
$ cp xdebug.so /Applications/MAMP/bin/php5/lib/php/extensions/no-debug-non-zts-20050922
Xdebugの設定
Xdebugを使えるようにするには、/Applications/MAMP/conf/php5/php.iniを編集し、
以下の設定をファイルの最後へ追加します。
[xdebug]
zend_extension="/Applications/MAMP/bin/php5/lib/php/extensions/no-debug-non-zts-20050922/xdebug.so"
xdebug.remote_enable=1
xdebug.remote_host=localhost
xdebug.remote_port=9000
xdebug.remote_autostart=1
また、Zend Optimizerを無効にするため、以下の行の先頭にセミコロンを入れ、コメントにします。
zend_extension_manager.optimizer=/Applications/MAMP/bin/php5/zend/lib/Optimizer-3.3.3
MacGDBpでスクリプトをデバッグする
MacGDBpを起動すると、デバッガ画面が開きます。この状態で、デバッグしたいページをブラウザからアクセスすると、ブラウザ上には何も表示されませんが、MacGDBpでは次のような画面になり、スクリプトの先頭で停止します。
画面上部左側では、変数の内容を確認できます。
スクリプトを任意の場所で停止したい場合は、Breakpointsウィンドウを開き、画面下部の「+」をクリックしてスクリプトを指定し、画面上部に表示されたスクリプトから停止させたい箇所の行番号部分をクリックします。
これでPHPスクリプトのデバッグが出来るようになり、ダイナミックパブリッシングに対応したMTプラグインの開発効率が上がるはず(?)です。
プラグイン(には限りませんが)を書いていると、これから書こうとしているコードやちょっとした思いつきが正しく動くのかどうか確認したくなることがあります。
確認のためには、最低限の動作をするプラグインに仕上げ、ブラウザからアクセスし、ログあるいはデバッガで確認するという手順を踏む必要がありますが、確認したいコードがたった1行、例えば、MT->version_number()がどういう形式の値を返すのか知りたい、というときには、いちいち前述のような作業を行うのは面倒です。また、最低限の動作をさせるために書いた部分に問題があり、もともと確認したかったところへなかなか到達しない、ということもありがちです。
そうした場合に、役に立つのが、コマンドラインからMTの一部の機能を操作するスクリプトです。(スクリプトといっても、デバッガが起動し、MTのインスタンスを生成した後、breakするだけなのですが...。)
==
#!/usr/bin/perl -d
use lib '../lib';
use vars qw( $mt );
use MT;
BEGIN {
$mt = MT->new;
}
$DB::signal = 1;
==
これをMTをインストールしたディレクトリの下にある、toolsディレクトリに配置して、そこから起動します。ここではconsoleというファイル名にしています。
==
$ perl console
Loading DB routines from perl5db.pl version 1.28
Editor support available.
Enter h or `h h' for help, or `man perldebug' for more help.
main::(console2:23): $DB::signal = 1;
DB<1>
==
スクリプトを起動すると、デバッガのプロンプトが表示されますので、後はperlのプログラムを記述するだけです。変数$mtがMTのインスタンスですので、これを使っていろいろと試すことができます。
たとえば、前述のバージョン番号を調べるのであれば、
==
DB<1> p $mt->version_number
4.22
==
とします。
公開済みのエントリの一覧を取得し、タイトルを表示するには、
==
DB<2> @entries = MT::Entry->load({status=>MT::Entry::RELEASE()})
DB<3> print $_->title,"\n" for @entries
Movable Type を利用してウェブサイトをリニューアルしました
Movable Type 4 へようこそ!
DB<4>
==
などとします。
スクリプトの中にサブルーチンを定義しておくと便利です。例えば、変数をダンプするのに毎回、
==
print Data::Dumper->Dump($v);
==
と入力するのは面倒なので、
==
sub dd {
my ($v) = @_;
require Data::Dumper;
print Data::Dumper->Dump($v);
}
==
と定義しておけば、
==
dd $v
==
だけで済みます。YAMLでフォーマットされたのが見やすければ、
==
sub xx {
my ($v) = @_;
require YAML;
print YAML::Dump($v);
}
==
と定義しておき、
==
xx $v
==
とすることができます。
ちょっと動作を確認したい、という場面で役に立つと思いますが、いかがでしょうか?
いかにも狙ったようなタイトルで申し訳ないですが、私、えんどうが普段、MTプラグイン開発で使っているソフトウェアを紹介してみようと思います。ちなみにOSは、MacOS X 10.5(Leopard)です。
* "MTPlugin-Starter":http://sourceforge.jp/projects/mtpluginstarter
MTプラグインのひな形を作るPerlスクリプトです。これなしでスクラッチから書くなんてできません。
* "Carbon Emacs":http://homepage.mac.com/zenitani/emacs-j.html
長いこと使っている割には、ぜんぜん使いこなせていませんし、ほとんどカスタマイズもしていません。たまに他のエディタも使ってみますが、なぜかすぐにEmacsに戻ってきてしまいます。
* "MAMP":http://www.mamp.info/en/index.php
apache/mysql/phpをまとめてインストールできるので重宝しています。この環境下に複数のバージョンのMTをインストールして使っています。
* "Terminal":http://www.apple.com/jp/macosx/
apache/php等のlogを表示させていますが、mysql, perldoc, perl debuggerなども開いています。
* Firefox/Safari
開発中はほぼFirefoxしか使いません。よく使うプラグインは、Firebug, Web Developper, Live HTTP Headersです。Safariは調べものと最終的なテストで使います。
* "Parallels":http://www.runexy.co.jp/products/parallels-mac/
おもにIE6でテストするためにWindows 2000を入れて使っています。ごくまれにLinux環境での動作確認に使用する場合もあります。
* "MacGDBp":http://www.bluestatic.org/software/macgdbp/
PHPのXDebugのフロントエンドです。GUIで操作しなければいけないのがちょっと面倒ですが、なかなか役に立ちます。
* "LimeChat":http://limechat.net/mac/index_ja.html
私は在宅で仕事をしているので、会社の他のメンバーに「ちょっと教えてー」と話かけるのに使います。もちろん雑談します。たまにお客様と連絡を取ったりもします。
* "辞書":http://www.apple.com/jp/macosx/
変数やメソッドに名前を付けるときに使います。スペルチェックもしますが、和英辞書として使う方が多いです。
* "iTunes":http://www.apple.com/jp/macosx/
音楽なしで仕事なんて考えられません。
最後はちょっと苦しい感じでしたが、なんとか10個挙げてみました。特にこれがないと困るという状況にならないよう、代替できるものがあるものを、なるべくカスタマイズせず、素のまま使うように心がけています。
Movable Type のプラグインをデバッグする方法というと、ログにメッセージや変数を出力する、いわゆる「printfデバッグ」になると思います。
ですが、怪しいと思う場所をすんなりと特定できなかったり、変数が想定していたのとは違う値を持っていたり、となるとログを取る場所や変数を変えたり、増やしたり、という作業を繰り返すわけですが、何度も同じ作業をやるのは面倒だし、時間はかかるし、イライラしてきます。
そういう時は、printfデバッグをさっさとあきらめ、perl debuggerを使ってデバッグします。
- ソースを編集し、デバッガを起動したい行の直前に、以下の1行(ブレークポイント)を設定します。(MTのコードはBEGINプロックで実行されるので、デバッガのプロンプトが出た時点では実行が完了しています。ですからソースに直接ブレークポイントを仕込んでおきます。)
$DB::signal = 1;
- デバッガ用にターミナルを開き、デバイス名を調べます。
# tty
/dev/pts/0
- ターミナルのデバイスファイルのパーミッションを変更します。
# chmod a+rw /dev/pts/0
- ターミナルのカラム、ライン数を調べます。
# stty -a
speed 9600 baud; rows 50; columns 102; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ; eol2 = ; swtch = ;
start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc ixany imaxbel
-iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe -echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
- .htaccessを編集し、事前に調べたターミナルのデバイス名、カラム、ラインを環境変数として設定します。
SetEnv PERLDB_OPTS TTY=/dev/pts/0
SetEnv COLUMNS 102
SetEnv LINES 50
- デバッガ用ターミナルで以下のコマンドを入力し、デバッガからの接続を待ちます。
# clear; sleep 10000
- mt.cgiを編集し、perlに渡す引数を-dに変更します。
#!/usr/bin/perl -d
- ブラウザからmt.cgiにアクセスします。
- 以下のような表示が出て、デバッガが開き、設定したブレークポイントで停止すれば成功です。
Loading DB routines from perl5db.pl version 1.28
Editor support available.
Enter h or `h h' for help, or `man perldebug' for more help.
MT::Plugin::Hoge::check_param(/var/www/html/mt/plugins/Hoge/hoge.pl:58):
58: my ($eh, $app, $param, $tmpl) = @_;
DB<1>
これでさっくりとバグを直してしまいましょう。