【PHPStorm】VPS上のWebアプリケーション（CakePHP）をリモートデバッグする

# 動作確認環境
- MacOS Sierra（開発PC。PHPStorm側）
 - Homebrew php71
 - Homebrew php71-xdebug
 - ブラウザ: Google Chrome, Firefox

※ おそらく開発PC側でのXdebugインストール有無は関係ない？

- CentOS7.3（VPS側。リモートデバッグ対象）
 - PHP 7.1.2
 - Xdebug v2.5.5
 - CakePHP2.9

# Xdebugのインストール
```bash
$ sudo pecl channel-update pecl.php.net
$ sudo pecl install xdebug

### インストール完了後に以下のようなメッセージが出力されます ###
# Build process completed successfully
# Installing '/usr/lib64/php/modules/xdebug.so'
# install ok: channel://pecl.php.net/xdebug-2.5.5
# configuration option "php_ini" is not set to php.ini location
# You should add "zend_extension=/usr/lib64/php/modules/xdebug.so" to php.ini
```

実行権限が無い状態（644）でインストールされるのでパーミッション変更しておきます。

```bash
chmod 755 /usr/lib64/php/modules/xdebug.so 
```

# Xdebug の有効化

インストール完了後の指示どおり、php.ini にパスを追加します。 
Xdebug の動作に必要な設定も併せて行います。

```ini:php.ini
[xdebug]
; パスは適時置き換え
zend_extension=/usr/lib64/php/modules/xdebug.so

xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9001
xdebug.idekey="PHPSTORM"
```

`xdebug.remote_port`のデフォルトは`9000`ですが、`php-fpm`と被るのでここでは`9001`に変更しています。
以下コマンドで設定が正常に反映されたことを確認して、Webサーバを再起動しておきます。

```bash
$ php -i | grep xdebug
# …中略…
# xdebug support => enabled

$ systemctl restart httpd
```


# PHPStormの設定
1. `Preferences > Languages & Frameworks > PHP > Debug` を開き、Xdebug のポートを `9001` に変更します。

2. `Preferences > Languages & Frameworks > PHP > Debug > DBGp Proxy` を開き、以下のように設定します（Host はIPでもドメイン指定でもOK。ただし、設定全体で統一しておきます）。
    
    ![php-storm-vps01.png](https://qiita-image-store.s3.amazonaws.com/0/184518/c6aaafad-d14f-cd47-3fd9-f4226d458c4f.png)
    
3. `Run > Edit Configurations...` を開いて「+」から `PHP Web Application` を追加し、以下のように設定しておきます（ `Start URL`は CakePHPの場合ですので置き換えてください ）。
    
    ![php-storm-vps03.png](https://qiita-image-store.s3.amazonaws.com/0/184518/57f15695-1a1a-887d-c885-35281d0418cb.png)
    
4. 同画面上にある `Server` の「…」を開き、VPSの設定追加と `File/Directory`（ローカルパス）と `Absolute path on the server`（VPS上の絶対パス）のマッピングを行います。マッピングが正しくないと breakpoint 張っても止まらないので注意してください（CakePHPの場合、webroot の index.php にも明示的にマッピングしたほうがいいかもしれません）。

![php-storm-vps02.png](https://qiita-image-store.s3.amazonaws.com/0/184518/690f8bba-6618-f7e0-4d47-71adc7fe4ad9.png)

なお、Apache側で https に強制リダイレクトするような設定がされてあったとしても、ポート番号は80のままでOKです。


# Mac OS（開発PC側）の設定
9001 番ポートをSSHポートフォワード（SSHトンネリング）しておきます。

```bash
ssh -R 127.0.0.1:9001:127.0.0.1:9001 user@test.example.com
```

VPSに接続後、`nmap` が使えるなら以下のコマンドで 9001 番ポートが使用されていることが分かります。

```bash
nmap localhost
# PORT     STATE SERVICE
# …中略…
# 9001/tcp open  tor-orport
```

また、Mac OS側では以下のコマンドで確認が可能です（ PHPStorm 上でのデバッグ最中のみ開放されるため、現段階では表示されません ）。

```bash
sudo lsof -i -P | grep "LISTEN"
# …中略…
# phpstorm  ……  TCP *:9001 (LISTEN)
```

# デバッグの実行
任意の行番号に breakpoint を張っておき、`Run > Debug` を実行します。すると、指定のブラウザが立ち上がりますので、設定が正しければデバッグすることが可能です。この際、URLのQueryStringには`XDEBUG_SESSION_START=XXXXX`というパラメータが付与されています。


# その他の検証
- Apacheで mod_security が有効でもデバッグ可能？
 - 可能です

- VPS側で 9001 番ポート開放しなくていいの？
  - SSHポートフォワードで事足りているため開放不要です
  - PHPStorm の `Start Listening for PHP Debug Connections`（電話マーク）もアクティブにする必要はないです

- [公式のブックマークレット](https://www.jetbrains.com/phpstorm/marklets/)は使わなくていいの？
 - 不要です

# 参考記事
[PHP SSHの逆ポートフォワードごしにリモートデバッグする | ytyng.com](http://b.ytyng.com/blog/php-remote-debug/)
[macでLISTENとして使用しているポートを調べる方法 - Qiita](http://qiita.com/yokozawa/items/dbcb3b31f9308e4dcefc)