今日は雑記のような内容なのですが開発者ブログということで大目にみてもらって。
現在はテレワークの問題もあり、自宅で作業している人も増えていると思います。そこでタイトルのままなのですが、下手にググってはまったので対処をメモしておきます。きっとこれでほとんどの人が解決するのではないかと思います。
目次
リモートのXdebugの設定もちゃんとしてあって、Validateも通っているのにwaiting for incoming connection with ide keyが出てうまくデバッグが動いてくれないならば、たぶん、あなたのPCとサーバー間通信の問題です。
どこかで通信が断絶しています。でもwating…というメッセージをみて、たぶんそれは予測されていますよね。
まずこちらの親切なサイトで、Xdebugのremote debugはサーバーからもあなたのPCに直接アクセスしてコネクションをはる必要があるということを押さえましょう。
当然、プロバイダとの契約次第になりますが、多くの人のPC環境では外部からグローバルIPで直接ポートをあけるなんて設定はしていないはずです。従って、そもそもXdebugのリモートデバッグ設定は無理です。
しかし、そのための対処としてsshトンネルという手法が使えます。
sshトンネル(ポートフォワード)とは、サーバーと自宅PCを通常通信ができるssh(port22)でつなぎ、通信確立後、ローカルPC、サーバー共に任意のポートに転送する仕組みです。こうすることで、途中のルーターやファイアーウォールに邪魔されずにデバッグ通信が可能になります。
ローカルのPCに仮想環境を構築せず、AWSやさくらVPSなどで検証サーバーを構築し、リモートデバッグしたい方は、どうしてもプロバイダ経由のインターネット通信を挟みますから、ほぼこのsshトンネルを使うことになると思います。
詳しい設定方法は下記PhpStormの公式サイトに記載があります。
macの場合はターミナルで実行します。
ssh -R 127.0.0.1:9000:127.0.0.1:9000 user@example.com
上記コマンドを実行すると、example.comにssh接続され、パスワードを要求されます(パスワード認証の場合)。一旦接続が確立されればトンネルが完成します。
上記コードの意味は、サーバー(example.com)のlocalhost:9000番ポートをローカルPCのlocalhost:9000番ポートに割り当てる(フォワード:転送する)という意味です。2つのポートがssh通信を介してリンクする(同一になる)ようなイメージです。
-RはリモートのRで、下記のようにも書けます。
ssh user@example.com -R localhost:9000:localhost:9000
-Rの後ろは一緒で <サーバーIP>:<転送ポート>:<ローカルIP>:<受信ポート>という構成です。こっちの方がわかりやすいかも知れません。
ポートフォワードについて、詳しくはこの方の記事がわかりやすいと思います。
SSHポートフォワード(SSHトンネル)【ローカル・リモート・ダイナミック総集編】
sshトンネルを設定したら、サーバー側の/etc/php.d/15-xdebug.iniファイル内で下記を設定します。(コンフィグファイルは違う場合もあります)
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_host=localhost
xdebug.remote_port=9000
上記により、サーバー側にアクセスがあるとデバッグセッションが始まります。その時サーバーはlocalhost(自分)の9000番ポートに接続します。そうすると、sshトンネルを介してあなたのPCの9000番ポートにそのまま情報が届きます。
PhpStormが正しく設定されていれば、その9000番ポートを待ち受けているはずですので、デバッグセッションが正しく開始されると思います。
それでもダメならファイアウォールなどを疑いましょう。有名な通信パケット閲覧ソフトであるWIRE SHARKを使えば、どんな通信が届いているのか確認できますので、トラブルシューティングに役立つと思います。
以上、今日は細かい話ですが、共有でした。