2011/12/20

Eclipse と Xdebug で PHP をステップ実行 PHP Advent Calendar jp 2011 #phpadvent2011

このブログ記事は PHP Advent Calendar jp 2011 に参加しています。
20日目でございます。
ちなみに、去年も参加してまして何を書いたかというと、
今更きけないあの娘の名前
完全にネタですほんとうにあr(ry
(今年はなんか堅い気がする。。。。)

前日19日目は @basuke さんの フレームワークで語るMVCの話 : PHP Advent Calendar #19 でした。自分は CakePHP を使うことが多いんですが、
Fat Controller になりがちです。ビジネスロジックはモデルで書く。というと、
「当たり前」になりますが。「ビジネスロジック」って抽象的に思えるんです。
じゃあ、どこまでが厚い薄いというのも無いですし・・・。
デファクトスタンダードのようなものがあると便利なんですけどね・・・。
記事を正座して読み返したいと思います。


こんにちはー

みなさんデバッグしてますか?
echo ?
print_r() ?
var_dump() ?
file_put_contents(LOG_FILE, var_export($vars, true) . "\n", FILE_APPEND) で tialf 監視?

自分好みのデバッグをしてると思いますが、
今回はステップ実行でのデバッグをご紹介。

必要なもの。

・WEBサーバーで動いてる PHP に組み込まれてる Xdebug
・Eclipse PDT (windows) (今回は。)
・PortForwarder (今回は。)
・and you!

それぞれインストールします。

まず今回の前提。
デバッグ対象のサーバーは、インターネットにある。
デバッグの結果は見たいクライアントは LAN にある。
こんなイメージ
client --------- |firewall| ----- server

server からは client は見えません。
そこでどうするかというと、ポートフォワーディングします。
SSH クライアントでもできるんだろうけど、今回は PortForwarder というのを使用。
ポートフォワーディングで client の 9000番ポートを server の 9000 番ポートにマッピングします。


では設定。

[xdebug]
yum で入れた xdebug なら /etc/php.d/xdebug.ini を編集します。
remote_host が localhost なのはポートフォワーディングするから。
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_port=9000
xdebug.remote_host=localhost
次は eclipse の設定
Window -> Preferences -> PHP -> debug

PHP Debugger: XDebug にします。

debug のアイコンをクリックし、 Debug Configurations を開きます。

左のリストから [PHP Web Page] をダブルクリックして新規に追加します。

[Name]: example debug (適宜)

[Server タブ]
Server Debugger: XDebug
PHP Server
[New] を押下して新規に追加します。
Name: example.com
Enter the URL that points to the document root on this server
http://example.com (最後のスラッシュはいらない)
[Finish] 押下


[File]にはエントリポイントとなるファイルを[Browse]を押下して選択
[URL] のAuro Generate のチェックを外して、[FIle]で入力したファイルに対応するURLを入力します。

で一応のこんなカンジ。
スクリーンショットがあれなのは気にしない!

[Apply] -> [Close] で設定閉じちゃいましょう。

そして最後に PortForwarder の設定。
任意の場所に config.txt を作成し、以下のように設定します。
ssh_config と一緒ですね。
Host example.com
 HostName IP_ADDRESS     
 Port PORT_NUMBER     
 RemoteForward 9000 localhost:9000     
 User SSH_USER
(値は任意にお願いします)
重要なのは RemoteForward 9000 localhost:9000 です。
そして、PortForwarder.exe と同階層に秘密鍵をおいて完了です。
詳しいことは サイト を確認してください。

では早速ステップ実行してみましょう。

まず、PortForwarder を起動します。
Host は 先ほどの config.txt で指定したHost 名
Config file は config.txt を指定しましょう。
Connect で接続します。


Eclipse に戻ります。
今回はこんなカンジでデバッグしてみたいと思います。
ステップとして止めたい箇所(行番号の左のスペース)をダブルクリックして ブレークポイントを設定します。
(このマークはおせんべいって言いたい派)


この状態で、デバッグのアイコンから作成したデバッグメニュー[1 example debug]を選択します。
そうすると、PHP デバッグパースペクティブが開いて、じっくり確認することができます。
(もしかすると、この時ゴニョゴニョ聞かれるかも)
実行時の最初のステップで停止してますので、
F8 で次のステップに移動したり、それまでに定義された変数を確認したり、
いろいろお試しください。
require.php に設定したブレークポイントで止まってるの図
Valiablesビューを見ると、$aへの代入は終わっていが、$bへの代入が終わってないことがわかる。


以上簡単ではありますが、Eclipse を用いたステップ実行のやり方でした。
せっかくIDE を使っているので、いろいろ便利なものは使いたいですね。
Emacs を使うとモテる
vim を使うとモテる
Eclipse を使うとモテる <- NEW!
になるといいなーと思う今日この頃。


明日21日目は @tsuyoshikawa さん です。
よろしくお願いします。