laradock + atom + xdebug でPHPをステップ実行する 

## はじめに

こんにちは、普段は業務で求人系サービスの開発や社内向けツールの開発を行なっている@taku-0728です。
今回は laradock + atom + xdebug でPHPのステップ実行を行います。
これができればわざわざprint文を仕込んでデバッグしたりすることがなくなりますので、作業効率の向上につながります。同じように laradock + atom で開発を行っている方は是非参考にしていただければと思います。

## やること

下の画像のように処理の途中で実行を一時停止しその時点での変数の中身を確認したり、コードを1行ずつ実行して次にどの条件分岐に入るのか確認したりできるようにしていきます。

![ステップ実行 (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257100/28b1f4a3-1955-66d8-b39b-080f8ba84a6c.gif)

## 開発環境

- OS：macOS Catalina 10.15.6
- PHP:7.4.11
- Laravel：6.18.26
- Docker：19.03.13

## 前提条件

Laravelプロジェクトを作成していること
laradockで必要なコンテナを立ち上げてブラウザからアクセスできること

## 実装
### 1. laradockの設定

まずlaradockの必要な設定を行います。
laradockのファイルが置いてあるディレクトリに遷移します。

``` 
$ cd xxxxxxx/laradock
```

envファイルを編集します。

``` 
$ vi .env
```

```shell:.env
WORKSPACE_INSTALL_XDEBUG=false

PHP_FPM_INSTALL_XDEBUG=false
```

この2行を

```shell:.env
WORKSPACE_INSTALL_XDEBUG=true

PHP_FPM_INSTALL_XDEBUG=true
```

こう変えます。
次に設定ファイルも変更します。

```
$ vi workspace/xdebug.ini
```

```ini:workspace/xdebug.ini
; NOTE: The actual debug.so extention is NOT SET HERE but rather (/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini)

xdebug.remote_host="host.docker.internal"
xdebug.remote_connect_back=0
xdebug.remote_port=9000
xdebug.idekey=PHPSTORM

xdebug.remote_autostart=0
xdebug.remote_enable=0
xdebug.cli_color=0
xdebug.profiler_enable=0
xdebug.profiler_output_dir="~/xdebug/phpstorm/tmp/profiling"

xdebug.remote_handler=dbgp
xdebug.remote_mode=req

xdebug.var_display_max_children=-1
xdebug.var_display_max_data=-1
xdebug.var_display_max_depth=-1
```

内容に多少差異はあると思いますが、大体こんな感じになっていると思います。
ここを下記のように書き換えます。
コメントアウトしていますが、別に消してもらってもかまいません。

```ini:workspace/xdebug.ini
; NOTE: The actual debug.so extention is NOT SET HERE but rather (/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini)

xdebug.remote_host=host.docker.internal
xdebug.remote_connect_back=0
xdebug.remote_port=9002
;xdebug.idekey=PHPSTORM

xdebug.remote_autostart=1
xdebug.remote_enable=1
;xdebug.cli_color=0
;xdebug.profiler_enable=0
;xdebug.profiler_output_dir="~/xdebug/phpstorm/tmp/profiling"

xdebug.remote_handler=dbgp
xdebug.remote_mode=req

;xdebug.var_display_max_children=-1
;xdebug.var_display_max_data=-1
;xdebug.var_display_max_depth=-1
```

似たようなことをもう一回やります。

```
$ vi php-fpm/xdebug.ini
```

```ini:php-fpm/xdebug.ini
; NOTE: The actual debug.so extention is NOT SET HERE but rather (/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini)

xdebug.remote_host="host.docker.internal"
xdebug.remote_connect_back=0
xdebug.remote_port=9000
xdebug.idekey=PHPSTORM

xdebug.remote_autostart=0
xdebug.remote_enable=0
xdebug.cli_color=0
xdebug.profiler_enable=0
xdebug.profiler_output_dir="~/xdebug/phpstorm/tmp/profiling"

xdebug.remote_handler=dbgp
xdebug.remote_mode=req

xdebug.var_display_max_children=-1
xdebug.var_display_max_data=-1
xdebug.var_display_max_depth=-1
```

ここも大体こんな感じになっていると思いますので、下記のように書き換えます。
コメントアウトしていますが、別に消してもらってもかまいません。

```ini:php-fpm/xdebug.ini
; NOTE: The actual debug.so extention is NOT SET HERE but rather (/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini)

xdebug.remote_host=host.docker.internal
xdebug.remote_connect_back=0
xdebug.remote_port=9002
;xdebug.idekey=PHPSTORM

xdebug.remote_autostart=1
xdebug.remote_enable=1
;xdebug.cli_color=0
;xdebug.profiler_enable=0
;xdebug.profiler_output_dir="~/xdebug/phpstorm/tmp/profiling"

xdebug.remote_handler=dbgp
xdebug.remote_mode=req

;xdebug.var_display_max_children=-1
;xdebug.var_display_max_data=-1
;xdebug.var_display_max_depth=-1
```

ここまでできたら、コンテナを起動します。自分の環境にあわせて適宜変えてください。

```
$ docker-compose up -d nginx mysql redis
```

**※私の環境では`xdebug.ini`の設定を変更する前にコンテナを起動していた場合、ステップ実行が正常に動作しませんでした。色々試しましたが最終的に一度イメージを削除して再度コンテナを起動すると正常に動作したので、もし正常に動作しなかった場合は一度イメージを削除して再度コンテナを起動してみてください。**

ここまでいけば、laradock側の設定は終了です。

### 2. atom側の設定
laradock側の設定が終わったので、次にatom側の設定を行っていきます。
理由は後述しますがここからは使用するPHPのバージョンによってやることが変わるので、使用しているPHPのバージョンに合わせて変えてください。

#### 使用しているPHPのバージョンが7.0以下の場合

パッケージの検索画面で`php-debug`と検索し、下記の画像と同じヒットしたパッケージをインストールしてください。
![スクリーンショット 2020-10-13 22.21.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257100/613ff94c-e746-a535-650c-8edab5937837.png)

インストールすると、下記の画像のように`atom-debug-ui`というパッケージと、`atom-ide-ui`というパッケージをインストールするように求められると思います。この2つのパッケージの役割は今回の記事の内容とは逸れるので割愛しますが、インストールした`php-debug`を動作させるには必須のパッケージですのでYesを選択してインストールしてください。
![スクリーンショット 2020-10-13 22.21.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257100/9b762b4d-a53c-b4d4-95ff-2fc0912f5eda.png)

`php-debug`,`atom-debug-ui`,`atom-ide-ui`の3つのパッケージをインストールしたら`php-debug`の設定画面を開いてください。
まずはPortの設定を行います。
下記の画像を参考に`Server Listen Port`を9002番`（php-fpm/xdebug.ini xdebug.remote_port, workspace/xdebug.ini xdebug.remote_portと同じ値）`に設定してください。
![スクリーンショット 2020-10-13 22.32.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257100/d4048645-86f3-18b5-753f-10e19b844f45.png)
次に`Path Mappings`の下記の形式を参考にremoteとlocalのパスの設定を行います。
`[{"remotePath":"","localPath":""}]`
remotePathにはdockerコンテナ内のファイルパスを、localPathにはMacbook内のファイルパスを指定します。
私の場合だと下記のようになります。当然ですが、ご自身の環境に合わせて変えてください。
![スクリーンショット 2020-10-13 22.44.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257100/a7666a89-2026-2a1b-4d49-8a82f9f93d68.png)

#### 使用しているPHPのバージョンが7.1以上の場合
インストールするphp-debugのバージョンを変更します。理由は`php-debug 3.5`以上の場合に必須となる`atom-ide-ui`にあります。このパッケージはatomにideのような様々な機能を持たせてくれる便利なパッケージなのですが、そのパッケージの機能の1つであるエラー解析がPHP7.0までしか対応していません。そのためPHP7.4から使える下記のような書き方をすると、エラーでないにもかかわらず警告が表示されてしまいます。

![スクリーンショット 2020-10-14 0.16.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257100/13341329-2265-ba57-b15d-c249b45a04a4.png)

そのままでも動くといえば動くのですが、警告がうっとうしいので`atom-ide-ui`を必要としない古いバージョンの`php-debug`をインストールしていきます。
私の環境がMacなので、Macを例にしてやっていきます。
左上のメニューから `Atom>シェルコマンドをインストール` を選択します。すでにインストールしていて、apmコマンドが使える方は飛ばしてください。
![スクリーンショット 2020-10-14 0.29.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257100/90ed915b-30d4-cda2-a70b-cdfe40d65f28.png)

シェルコマンドのインストールが完了すると、apmコマンドが使えるようになるのでターミナルを開いて下記コマンドを入力します。

```
$ apm install php-debug@0.2.4
```

インストールが完了したら、下記の画像を参考に Path Maps と Server Address を設定してください。
インストールした php-debug のバージョンが古いため、remotePathとlocalPathの形式が異なっています。下記画像を参考に間違えないようにしてください。
![スクリーンショット 2020-10-14 1.00.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257100/01d1a46d-1e70-ef9b-511a-f7f40362ccfd.png)

## 結果
ステップ実行ができるようになったので、快適なPHPライフを送りましょう。
![ステップ実行 (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257100/28b1f4a3-1955-66d8-b39b-080f8ba84a6c.gif)

## 参考
- [やっとできた BreakPoint (Docker Atom)](https://qiita.com/m-kushima/items/0d3317a1b949a72a8360)