それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

phpstorm でシンプルなコンソール実行デバッグ設定

phpstorm でphpデバッグ phpstorm で コマンドラインのコンソールで実行したphpデバッグする設定。

実行環境には、phpstorm 20202.2 と WSL でインストールしたphp を用いる

wsl のphp を使ったときに、ファイルを実行してブレークポイントで止めることをする。

wsl を使う場合のプロジェクト設定。

新規作成でプロジェクトを選ぶ。

f:id:takuya_1st:20210113100922p:plain新規で空のphpプロジェクト

f:id:takuya_1st:20210113100925p:plain デバッグしたいスクリプトを作る。 f:id:takuya_1st:20210113100929p:plain Run→ debug を選ぶ f:id:takuya_1st:20210113100933p:plain

ファイルをどうやって実行するかを選ぶ。

ここで、インタプリタを設定する。

f:id:takuya_1st:20210113100937p:plain なにもしてないと、インストール済みのPHPを探してくれるが、WSLの場合は自分で指定しないと探してくれない。 f:id:takuya_1st:20210113100940p:plain

f:id:takuya_1st:20210113100944p:plain インタプリタを設定する。

f:id:takuya_1st:20210113100948p:plain インタプリタの種類を選ぶ。WSLやVagrantSSHはここで設定する。 f:id:takuya_1st:20210113100951p:plain

WSLを選ぶと、WSLの中から which php して自動的に選んでくれる。

f:id:takuya_1st:20210113100955p:plain ここでは、プロジェクト単位の設定になる。もし全体に設定して使いまわしたいときはチェックを外せばいい。いつでもできるので確実に動くのを確認してから外したらいい。

f:id:takuya_1st:20210113100959p:plain 設定が終わったら、インタプリタが設定される。インタプリタとコード分析のベースとなるバージョンを選んで・・・ f:id:takuya_1st:20210113101005p:plain これでデバッグが実行できるようになる。いん f:id:takuya_1st:20210113101009p:plain

デバッグで実行すると次のような画面になる。下側にデバッグウインドウが表示される。

f:id:takuya_1st:20210113101013p:plain ブレークポイントを設定してデバッグで実行すると、ブレークポイントでちゃんと止まるようになる。

f:id:takuya_1st:20210113101019p:plain

ここでは、phpはシンプルにコマンドから php-cli を実行している。

phpstorm が php-cliを実行するときにデバッガを有効にして起動してくれる。

デバッグが実行されると次のようなプロセスが生えている。 f:id:takuya_1st:20210113101033p:plain このコマンド実行から、分かる通り、PHPStormがデバッグ起動時にphpデバッグオプションを渡して起動している。 さらに言えば、php-cliCLIphpデバッグで使っているのは xdebug である。

グローバル設定のxdebug が有効無効にかからわず、起動時にXdebugを有効にして起動しているのである。

この起動時に「Xdebug」を有効にして起動する。という考え方は ビルトインサーバーやLaravel artisan でサーバー起動するときにも使えるので覚えておくと便利だと思う。

当然だが、xdebugをインストールしていないとデバッグはできないのでエラーになる。(インストールして使用可能が大事なので、有効無効は問わない)

f:id:takuya_1st:20210113101025p:plain

そして、Xdebugのリモートデバッッグではあるのだが、PHPStormのリモートデバッグのリッスンは内部的に自動で行われるらしく おもしろいことに、デバッグ中でもリッスンのアイコンはDisconnectedのママである。

f:id:takuya_1st:20210113101029p:plain また、デバッグ中にnc でコネクションを張ろうと思っても、refuseされた。WSLのポートの取り扱いのせいかもしれない。

f:id:takuya_1st:20210113101037p:plain