PhpStormとXdebugでステップ実行  ①ステップ実行するための設定

# 概要
Xdebugを使ってみたので、分かったことや分からないままのことをまとめました。
**(2021/8/18追記：Xdebugはコードリーディングが辛いときに利用したくらいで、記事を投稿した時期以降は利用していません。コードを読むのに慣れてくるとXdebugが無くてもなんとかなります。Xdebugを利用すると動作が遅くなることがあるので、導入の際には十分検討してください。)**

※設定については、Dockerを利用している前提で説明します。
PhpStormの機能については、PhpStormでステップ実行するならどんな環境でも参考になると思います。
(InteliJについて書かれた記事も参考にしたので、JetBrainsのIDEを利用しているなら大体同じかもしれません)

## Dockerについて

この一連の記事が分かりやすいので参考にしてください。
[【Docker Compose】設定内容を1行ずつ理解しながらLaravel環境構築（PHP-FPM、Nginx、MySQL、Redis）](https://qiita.com/minato-naka/items/8b31d28823cabaa9487a#_reference-bf02d8091657f5545d6b)
※とくに参考にした3番目の記事のみを貼っています。
※分かりやすいので広まってほしい。


# ステップ実行ができる状態にするまでの設定

## 動作確認環境
(なにを記載すれば十分なのかわからないので自分の実行環境を書けるだけ書いておきます)

```
Windows10 Pro
PhpStorm 2019.2.1
Laravel 5.5
Docker Desktop 2.1.0.1
Docker 19.03.1
Nginx 1.12.2 (dockerコンテナ上でnginxが動作)
PHP 7.2 (dockerコンテナ上でphp-fpmが動作)
xdebug 2.7.2 (php-fpmコンテナにインストールする)
```

## XdebugをDockerコンテナにインストール

Xdebugをインストールするためのコマンドを、`Dockerfile`に記載します。

`Dockerfile`

```dockerfile
RUN pecl install xdebug \
   && docker-php-ext-enable xdebug
```

## xdebugをPHPで有効にする
php.iniにxdebugを有効にするための値を記載します。

`php.ini`

```php
xdebug.idekey="PHPSTORM"  // 識別しやすい値ならなんでもOK
xdebug.remote_enable = On
xdebug.remote_autostart = On
xdebug.remote_connect_back = Off
xdebug.remote_host = "host.docker.internal"
xdebug.remote_port=9001  // 何番ポートでもOK
```

`xdebug.idekey`と`xdebug.remote_port`は、後述するPhpStorm側の設定で利用するだけなので、好きなkeyやポート番号を使います。

他の項目が何を設定しているかについては、この記事を参考にしてください。
[[PHP] Xdebug のリモートデバッグ、理解していますか？](https://qiita.com/castaneai/items/d5fdf577a348012ed8af)

※`xdebug.idekey`や`xdebug.remote_port`をPreferencesで設定せずともXdebugを使えるらしいです。再現できず、正確な方法が分からなかったため今回は`xdebug.idekey`等を設定する方法で説明します。

[PHPアプリ開発をPhpStormでスムーズに始められるよう、設定ファイルとドキュメントを用意する](https://devblog.thebase.in/entry/2019/08/22/110000)

> PHPアプリリポジトリに docker-compose.yml を用意しておけば、Preferences を開いて設定しなくても、PhpStormでデバッグできました。

## Dockerコンテナを起動する
`Dockerfile` と`php.ini`を記述したら、Dockerコンテナを起動します。

```
$ docker-compose up -d 
```

これで、Xdebugが有効になった環境が整いました。

## PhpStormの設定
次に、PhpStormでステップ実行を行うための設定をします。
ここからは画像で説明していくので、 `Ctrl + Alt + S` で設定画面を開いてください。
まず、先ほど`php.ini`に記載したポート番号を入力します。
デフォルトの9000でもよいのですが、[メモ PHP docker xdebug](https://qiita.com/tttreal/items/59cd31c59b29e902e39f)によると、

> なんでかXdebugがデフォルトで使うport:9000と、php-fpmがデフォルトで使うport:9000とが、被っているので、どちらかを変える必要がある

そうなので、9001を指定しています。
ポート番号が他のプロジェクトやツールと被らなければ、恐らく何でもいいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/f596d765-e643-437d-f47a-46956f8ec365.png)

Serversの設定では、
①Name, Host, Port, Debuggerを設定します。
Name, Host は識別のための名前なのでどんな名前でもOKです。
Portには先ほど設定した9001、
Debuggerには、今回使うXdebugをセットしておきます。

②Use path mappingsにチェックを入れます。

③File/Directoryにはローカルのパスが書いてあり、
Absolute path on serverには対応するDockerコンテナ側のパスを書きます。
`docker-compose.yml`でマウントさせているパスが対応づけられていれば大丈夫だと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/914233cc-1a3d-a624-0512-9e7cbc56ce79.png)

ツールバーのこの部分から、`Edit Configuration...`をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/bf4b3656-f9a8-7212-833e-48182a6e7c5c.png)

Run/Debug Configurations ウィンドウが開かれます。
+マークをクリックしてPHP Remote Debugを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/4e318e3a-2f6c-548b-0f12-6780d2131bd7.png)

新規の設定ファイルが作成されます。

①Nameには適当な名前を入力、
②Serverには先ほど任意の名前をつけたServerを選択、
③IDE keyにはphp.iniで記入した値を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/96bd11e6-4a46-2e12-5223-b7e34d7730cc.png)

完成した設定ファイルをセットしたら、

 ![the Debug button](https://pleiades.io/help/img/idea/2019.2/icons.actions.startDebugger.svg@2x.png) のアイコンをクリックして ![the Active Debugger icon](https://pleiades.io/help/img/idea/2019.2/debug_active.png) の状態にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/3fc47fda-9d6f-dcf0-15aa-608a0692d97d.png)

デバッグしたい処理の任意のコードにブレイクポイントを設定します。(x行目を表す数字の右側をクリックでON/OFFできる)
ブラウザでLaravelのアプリケーションを動かし、実際にその処理を走らせると、
Incoming Connection from Xdebugというウィンドウが表示されるので、**Accept**ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/976d0814-dd58-17bb-1665-f7ab77a5e995.png)

すると、ブレイクポイントを設定した時点でプログラムが中断され、ステップ実行することができます。
Debugウィンドウには、スタックトレース、リクエストで渡された値が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/491e645d-a066-d826-c266-441b7a650177.png)

# 参考

[メモ PHP docker xdebug](https://qiita.com/tttreal/items/59cd31c59b29e902e39f)
[PHPアプリ開発をPhpStormでスムーズに始められるよう、設定ファイルとドキュメントを用意する](https://devblog.thebase.in/entry/2019/08/22/110000)

# 次へ
長いので2つに分けました。
PhpStormとXdebugでステップ実行 ①ステップ実行するための設定
[PhpStormとXdebugでステップ実行 ②PhpStormの機能、使い方](https://qiita.com/haruna-nagayoshi/items/f6fd4ed2b4b8f22d3faa)