PHPStormでステップ実行（Docker Toolbox環境）

※Docker for Mac(Windows)の場合は以下を参照してください。
https://qiita.com/yKanazawa/items/363ba93f8a376c5b9e75

Vagrant共有フォルダ機能を利用し、PHP StormでXDebugでステップ実行している方も多いと思いますが、Docker Toolbox環境でも可能です。

Docker Toolboxから起動したDocker machineのIPアドレスは、
デフォルトでは、192.168.99.100になりますが、
Docker Machineのコンテナ内において、
xdebug_remote_hostを192.168.99.1に設定することで、
ローカルPC内のPHP Stormと通信することが可能になります。

## コンテナ内のphp.d/xdebug.ini設定
コンテナ構築時に、php-pecl-xdebugをインストールし、php.d/xdebug.iniに以下の設定をしておきます

```
[xdebug]
zend_extension="/usr/lib64/php/modules/xdebug.so"
xdebug.remote_enable = On
xdebug.remote_port = 9000
;xdebug.remote_autostart = On
xdebug.remote_host = 192.168.99.1
xdebug.profiler_output_dir = "/tmp"
xdebug.max_nesting_level= 1000
xdebug.idekey = "PHPSTORM"
```

※xdebug.remote_autostart = onのコメントアウトを解除すると、PHP Storm側でステップ実行が可能になりますが、 PHP Stormがないと処理が先に進まなくなるため、普段はコメントアウトしています

# VirtualBoxの共有フォルダ設定

ここでは、以下の前提で設定します。

フォルダーのパス：D:\cygwin64\home\username
フォルダー名：Users

![image](https://qiita-image-store.s3.amazonaws.com/0/38162/e08d33c7-43fd-a3e5-a5d8-08d830bbbbf9.png)

## コンテナのマウント設定

* D:\cygwin64\home\usernameにwwwディレクトリを作成
  * Docker Machine内では/Users/www/ディレクトリと共有される
* D:\cygwin64\home\username\wwwにtestプロジェクトを配置
* wwwディレクトリをコンテナ起動時に-vコマンドでマウント

```
docker run \
--name $DOCKER_NAME \
-v /Users/www:/var/www \
--hostname $DOCKER_NAME \
--privileged \
-d $IMAGE_NAME
```

# PHP Stormの設定
Macの場合：PHPStorm -> Preferences... > Languages & Frameworks > PHP > Debug
Windowsの場合：File -> Settings... > Languages & Frameworks > PHP > Debug
において、以下のように設定
![image](https://qiita-image-store.s3.amazonaws.com/0/38162/31889a23-8455-016d-72b5-5d0d80668c1a.png)

Preferences... > Build, Execution, Deployment > Deployment
+を押下
Connectionタブにおいて以下のように設定
![image](https://qiita-image-store.s3.amazonaws.com/0/38162/37f675c9-5499-e1d7-17a6-3ddb54c632b1.png)

Mappingsタブ
![image](https://qiita-image-store.s3.amazonaws.com/0/38162/17e6c617-aec9-9d6f-1b2d-3e96041edc6c.png)


Preferences... > Languages & Frameworks > PHP > Servers
+を押下
![1.png](https://qiita-image-store.s3.amazonaws.com/0/38162/e6b5560a-26e8-db61-958a-d9867c1e40a0.png)


# ステップ実行の設定

PHPStorm画面右上にある電話アイコンをクリックし、connectを有効にします。 

![image](https://qiita-image-store.s3.amazonaws.com/0/38162/33a99f6e-1bc1-9cf0-9453-955696aa9a71.png)

※有効にすると、コンテナからローカルPC（192.168.99.1）に対して9000番ポートで通信できるようになります

```
$ telnet 192.168.99.1 9000
Trying 192.168.99.1...
Connected to 192.168.99.1.
Escape character is '^]'.
```

## PhpStorm Debug設定
Run > Edit Configurations...
+を押下
PHP Remote Debugを選択

![image](https://qiita-image-store.s3.amazonaws.com/0/38162/713bb0cb-16b0-ee1a-514a-69f95cd6c859.png)


* 先ほど設定したServersを選択
* Ide key(session id)にphp.iniのxdebug.idekeyを設定
* 「OK」ボタンを押下

# ステップ実行の開始

## xdebug.ini設定

コンテナ内のphp.d/xdebug.iniの
xdebug.remote_autostart = On
のコメントアウトを解除します

```
[xdebug]
zend_extension="/usr/lib64/php/modules/xdebug.so"
xdebug.remote_enable = On
xdebug.remote_port = 9000
xdebug.remote_autostart = On
xdebug.remote_host = 192.168.99.1
xdebug.profiler_output_dir = "/tmp"
xdebug.max_nesting_level= 1000
xdebug.idekey = "PHPSTORM"
```

httpdを再起動します

```
sudo service httpd restart
```

## ステップ実行の開始

PHP Stormでブレークポイントを設定しておくと、設定した箇所からステップ実行できるようになります。

例えば、app_controllerのbeforeFilter内にブレークポイントを設定して
http://dev.example.jp/
にアクセスすると、ブレークポイントの箇所からステップ実行が可能になります。
![image](https://qiita-image-store.s3.amazonaws.com/0/38162/ad52986f-5545-696e-509a-8fb786ca9eb9.png)