PhpStorm
xdebug

【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のインストール

$ 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)でインストールされるのでパーミッション変更しておきます。

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

Xdebug の有効化

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

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サーバを再起動しておきます。

$ 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

  3. Run > Edit Configurations... を開いて「+」から PHP Web Application を追加し、以下のように設定しておきます( Start URLは CakePHPの場合ですので置き換えてください )。

    php-storm-vps03.png

  4. 同画面上にある Server の「…」を開き、VPSの設定追加と File/Directory(ローカルパス)と Absolute path on the server(VPS上の絶対パス)のマッピングを行います。マッピングが正しくないと breakpoint 張っても止まらないので注意してください(CakePHPの場合、webroot の index.php にも明示的にマッピングしたほうがいいかもしれません)。

php-storm-vps02.png

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

Mac OS(開発PC側)の設定

9001 番ポートをSSHポートフォワード(SSHトンネリング)しておきます。

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

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

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

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

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(電話マーク)もアクティブにする必要はないです
  • 公式のブックマークレットは使わなくていいの?

    • 不要です

参考記事

PHP SSHの逆ポートフォワードごしにリモートデバッグする | ytyng.com
macでLISTENとして使用しているポートを調べる方法 - Qiita