大変に今更ながらxdebugの「リモートデバッグ」とは何か

コネクションコールバックが〜とかポートが〜とか。
いんたーねっとに転がっている「xdebug.iniに、こんな風に書いてくれよな!!」というのを丸呑みしている日々が、続いておりました・・・(恥)

で、「なんかdockerでリモートデバッグが動かないよ〜><」というのを、妥協して怠惰に目を瞑って過ごしていたのですが、この記事と出会い。

blog.shin1x1.com

見事に問題が解消されました嬉しい・・・!

これをきっかけに、「そもそもどういう仕組で、クライアントに「デバッグ」な情報を送っているのかな〜」というのを、整理したいなと思ったのでした。

全体感

なんてことはない、公式のドキュメントのこの図が1番わかりやすい・・・・ dbgp

さて、この記事を読むのが良いです。 Xdebug: Documentation

DBGp

Xdebugは、コードを評価してクライアントと相互にやりとりをしながらデバッグをしていくことを可能にするよ!」「そのやりとりに使われるのが、 DBGp っていうプロトコルなのさ!」みたいなことが書いてあります。

詳細には、こっちで書かれていますね。 Xdebug: Documentation - Protocol - DBGp

クライアント

f:id:o0h:20171029135641p:plain こんなにも・・・!

設定項目について

ここが「1番実用的な知識」であり、今このようなメモを残すきっかけとなった本題です。

In order to enable Xdebug's debugger you need to make some configuration settings in php.ini. These settings are xdebug.remote_enable to enable the debugger, xdebug.remote_host and xdebug.remote_port to configure the IP address and port where the debugger should connect to. There is also a xdebug.remote_connect_back setting that can be used if your development server is shared with multiple developers.

ってことだから、ココらへんを見る。

remote_enable

「クライアントに接続しにいかせるやつ、いる?」のOn/Off。
「もし接続が確立できなかったら、この値がOffになっているものとして扱うよ〜」と書いてある、まぁそうですよね。

remote_host

「接続しに行ってOKなクライアントはどこ!?」の項目。「ここからの通信だけでDBGpでの交渉を許可する」、ってことであっているのかな・・?

書き方は

you can either use a host name, IP address, or 'unix:///path/to/sock' for a Unix domain socket

です。

remote_connect_back

「接続してきたホストにXGDp接続をしにいくか」。
何かというと「remote_host設定に関わらず(すなわち、設定値を無視して or 設定されていなくても )、リクエスト元をリモートデバッグクライアントとみなして通信しに行く」。

個人的には、 ローカル開発ならコレ使えばいいかな〜と思っていたので、前に晒したDockerfileではremote_hostでなくてこっちをenableにしているのだけど。どうなんだろう〜

もしくは、「チームで利用するリモートの開発サーバー」とかはこれ使う感じかと

There is also a xdebug.remote_connect_back setting that can be used if your development server is shared with multiple developers.

remote_port

「接続を試みるポート」。
例えば 「macでPHPStormを使っていてDockerコンテナのPHPでリモートデバッグをする」といった場合、「コンテナからmac(ホストマシン)の9000番に接続が来る」と・・・

remote_mode

これ知らなかった。「いつ有効にする(接続を返しに行く)か?」みたいなところ、かな・・?

Allowed values for this setting are "req" (the default) which makes the debugger initiate a session as soon as a script is started, or "jit" when a session should only be initiated on an error.

stormにも記事がある。 https://blog.jetbrains.com/jp/2013/12/19/343blog.jetbrains.com

remote_autostart

本来は「特定のパラメータ名」を付与したリクエストが来たときのみリモートデバッギングが始まるところを、この設定がOnになっていると「自動的に始まる」というもの。 冒頭で紹介した記事中でも、autostartが有効化されています。

ideky

「特定のパラメータ名」の設定がこれ!
例えば idekey=session_nameだった場合、

simply add XDEBUG_SESSION_START=session_name as parameter to the URL. Instead of using a GET parameter, you can also set XDEBUG_SESSION_START as a POST parameter, or through a cookie.

ということです。

要するに、 http://blog.example.com/post/100デバッグしたいときには、 http://blog.example.com/post/100?XDEBUG_SESSION_START=session_name というようにパラメータを付与してリクエストをする必要があるということです。

それによってXDEBUG_SESSION 情報がCookieに保持されます。

GET/POSTで値を渡された or セッション情報が記録されている場合のみ、デバッグセッションに入るといったことです。
※ HTTP Debug Sessionsのセクションを参照してください

先の autostartが有効化されていたら、 even if the GET/POST/COOKIE variable was not presentデバッグが始まるよ〜!となります。

関連: remote_cookie_expire_time

全員集合!設定項目

リモートデバッグのみでなく、Xdebug全体の設定項目についてはこちらに。 https://xdebug.org/docs/all_settingsxdebug.org