Xdebug 参ノ型 – リモートサーバー+Docker
リモートサーバー(VPS)+Docker環境
構成
Windows 10, Ubuntu 20 LTS、VPSはConoHa VPS
リモート開発に関してはVS CodeとPHPStormではアプローチが違っている。
おそらく、VS CodeはSSHやContainerに接続するために開発PCにIDE本体を置いていて、コンフィグレーションなどをリモートに保存するだけ。一方PHPStormはリモート側にIDEの本体をがっつりインストールして開発PC側のIDEはシンクライアントという役割で動作する。
VS Codeに比べてPHPStormの環境設定はかなりハードルが高い。
サーバー設定
Docker環境構築
リモートのVPSに以下のディレクトリ構成にそれぞれファイルを作成する。
サンプル用ディレクトリ : php_xdebug_app
├── docker │ └── php │ ├── Dockerfile │ └── php.ini ├── html/ │ ├── index.html │ └── phpinfo.php └── docker-compose.yml |
※ docker/php下のファイルは1階層上げて/docker直下でも良いが、DBサーバが必要となったときにdocker/db下に関連ファイルを置くというのがよくあるパターンなのでこうしておく。
※ docker/php/pnp.iniとは別にxdebug用の設定だけをxdebug.iniに配置することもよくあるが説明を簡略化するためphp.iniにxdebug関連の設定を入れた。
docker-compose.yml
version: ‘3.8’ services: php: build: ./docker/php container_name: ‘php-xdebug’ ports: – ‘8180:80’ extra_hosts: – “host.docker.internal:host-gateway” volumes: – ./html:/var/www/html – ./docker/php/php.ini:/usr/local/etc/php/php.ini |
※ WSLの時と違い、ホストのサーバー名「host.docker.internal」が名前解決できないのでextra_hostsを入れる。
Dockerfile
FROM php:7.4-apache RUN pecl install xdebug \ && docker-php-ext-enable xdebug |
php.ini
[xdebug] xdebug.mode=debug # xdebug.start_with_request = yes xdebug.client_host=host.docker.internal xdebug.client_port=9103 |
※ xdebug.start_with_requestは好みで
index.php
<h1>Hello x-debug</h1> |
phpinfo.php
<?php phpinfo(); |
コンテナ作成
cuore@160-251-49-56:~/php_xdebug_app$ docker-compose up -d |
コンテナ側でApache起動(Apacheが起動していなければ)
root@cf9d7ef146f1:~# service apache2 start Starting Apache httpd web server: apache2. |
動作確認
ブラウザから以下のURLでアクセス
http://php-xdebug.cuore-apl.com:8180/phpinfo.php |
正常に表示されればOK。
3.2 VS Code
リモート接続
VS Codeの左のメニュー「Remote Explorer」でVPSへSSH接続する。
ブレークポイント設定
VS Codeからデバッグ対象のファイルを開きブレークポイントを設定
デバッグ構成
左のメニューから「Run and Debug」を選び、「RUN AND DEBUG」画面を表示する。
Create a launch.json file.のリンクをクリック。
環境としてPHPを選択。
launch.jsonが開くのでソースを修正
{ “name”: “Listen for Xdebug”, “type”: “php”, “request”: “launch”, “port”: 9103, “pathMappings”: { “/var/www/html”: “/home/cuore/php_xdebug_app/html” } }, |
pathMappingsの設定を誤るとブレークポイントで止まらないので慎重に設定すること。
実行前 | 実行後 |
このように実行してもブレークポイントをスルーして赤丸が白丸になる。
VS Codeをリッスン待ちにする
デバッグ環境として今設定した「Listen for Xdebug」を選択しボタンをクリック。
デバッグ側でリッスン開始される。(もちろん、launch.jsonで指定した9103ポート)
VS Codeの下部のステータスバー(?)がオレンジ色になりデバッグ中であることがわかる。
ブラウザからアクセスしブレークポイントで止める
テスト対象URLをブラウザからアクセス(docker-compose.ymlで指定した8180番ポート)
http://php-xdebug.cuore-apl.com:8180/phpinfo.php?XDEBUG_SESSION_START=XXX |
XXXは任意の文字列、このテストでは実際に”XXX”としている。
※ このパラメータをいちいちつけるのが面倒であれば、Chromeの「Xdebug helper」等を利用すればよい。
無事、ブレークポイントで止まりました。
この状態でステップ実行が可能。
PHPStorm
リモート開発環境
PHPStormの場合、IDE単体ではなくJetBrains Gatewayを開発用PCにインストールして構築する。
https://blog.jetbrains.com/ja/blog/2021/12/21/dive-into-jetbrains-gateway
図ではJetBrains IDE or JetBrains Gatewayとなっており、必ずしもJetBrains Gatewayは必要でないように思えるが、これはIDEにJetBrains Gatewayの機能を持ったプラグインを入れた場合ということであるらしい。
ということでインストール済みのPHPStormのプラグインを見てみるとすでに「Remote Development Gateway」がインストールされている。
SSH接続設定
ウェルカムページを表示。(開いているプロジェクトがあれば閉じれば表示される)
Remote Development > SSH
Betaというのが気になるが・・・
New Connectionをクリック。
SSH接続に必要な情報を入力。
SSH接続のための情報を入力。電子証明書もConoHaから事前に落としたもの。
Check Connection and Continueをクリック
ここでPhpStormなり、自分の保有するライセンス製品にしておかないと後でライセンス認証できない。間違えてIntelliJ IDEAにしたときは、インストール後に「試用版」としてのライセンスで入れる。
Project directoryの「」をクリックするとちゃんとリモートのディレクトリが表示される。
バックエンドのインストール
プロジェクトのパスを入れてDownload and Start IDEをクリック。(何をダウンロードするのだろうか、それは次のイメージで明らかに)
リモートサーバーにIDE backendをインストールしてくれる。
失敗
失敗からのリカバリー経緯は「残心の章」参照。
成功するとこのようにIDEでプロジェクトが開きます。
バックエンドのインストール先
IDE config directory: ~/.config/JetBrains/RemoteDev-PS/_home_cuore_php_xdebug_app
IDE system directory: ~/.cache/JetBrains/RemoteDev-PS/_home_cuore_php_xdebug_app
CLI インタープリターの設定
Xdebugのための設定は弐ノ型と同様ですが、IDEの見た目がローカルとリモートバックエンド接続とで少し違うので念のためスクリーンショットを載せます。
Settings > PHP > CLI インタープリターの設定
Settings > PHP > CLI インタープリターの設定 > Server
上記のServerの構成はConnect to Docker daemon with: 「Unix socket」。正常ならダイアログ下部にConnection successfullが出ます。
Settings > PHP > Servers
デバッグポートの設定とリッスン
Settings > PHP > Debug
ポート番号はphp.iniのxdebug.client_portの値。(画面表示のためのポート8180とは別です)
注意)
この画面のなかにポートのListeningボタンがあります。なぜかIDE本体のデバッグツールバーにはありません。最初これをほったらかしでテストして全くブレークポイントで止まらず悩みましたが、ここをONにしたら正常に止まりました。こりゃちょっとした罠ですね。
↓ |
Run > Edit Configurations
Server:はPHP > Serversで作成したサーバー名。
ブラウザからアクセスしブレークポイントで止める
ブラウザーからアクセスするURL
http://php-xdebug.cuore-apl.com:8180/phpinfo.php?XDEBUG_SESSION_START=PHPSTORM |
無事、ブレークポイントで止まりました。
後で気づいたが、Dockerにこのようなコンテナが出来ています。
他のリモートサーバー環境での検証
Linode
LinodeのUbuntu 14では失敗。
EC2
AWSのEC2(t2.small)にUbuntu20のインスタンスを作成してトライ。
なんなく成功。
ブレークポイントで正しく止まります。