プログラミングの役立つ記事をお届けします

Docker + PHP + Xdebugで約5分後にセッション終了する問題の解決方法

どうもこんにちは、カフーブログのタカフです。

僕はとんでもなく役立つ方法を見つけてしまったかもしれません。

そう、タイトルの通りDocker + PHPの開発環境でXdebugを使っていると約5分後にセッションが切れてデバッグ終了してしまう忌まわしきあの問題ですよ!😂

これずっと困っていたのですが、とうとう重い腰を上げて調査したら解決方法がわかったので本記事ではその方法をご紹介致します。

Docker + PHP の開発環境構築方法なら以下の記事が役立ちます。

【Mac/Win対応】DockerでPHPローカル開発環境の最強構築方法

問題

まずはどんな問題だったかを説明します。

PHPにはXdebugという超絶便利なデバッグ機構があるのですが、Docker環境でそれを使ってステップ実行していると数分後に途中で途絶えてしまう現象があったのです。

因みに、XAMPPとかMAMPのPHPだったらこの問題は発生しません。

僕はデバッグして変数とか見ながらじっくり考えたいタイプなのですが、このじっくり考えている間にXdebugが終了しちゃうので非常に困っていました。

しかも、Xdebugだけセッションが終了しててその後のPHPの処理だけは継続されるからたちが悪いときたもんです。

実験

ここでその問題発生の実験をしてみます。

以下のようなコードを書いて途中でブレークポイントを張っておきます。

ブレークポイントを見てもらいたいので画像でコードを見せます

要はPHPの処理が始まって開始時刻を取得したら、終了時刻を取得する前にブレークで止めておいて、

問題発生してここでセッションが切れたとするとそれは何秒後なのかを確認する為です。

結果はこのようになりました。

2021/11/19 09:27:06
2021/11/19 09:32:25
319

こちら何回かやってみたところ、319以外にも330とか色々ばらついていて、

300秒きっかりで途絶えるのではなく300秒後にある程度の秒数が経過すると途絶えるようでしたので、300秒後は不定といった感じでした。

この実験から、Xdebugのセッションだけ約5分後に切れてその後のPHPの処理だけは続行しているということがわかりました。

原因

原因は、どうやらDockerのTCP接続のアイドル時間が一定時間続くとタイムアウトしてしまう仕様のようでした。

色々ググりにググってたどり着いた以下のページでわかりました。

https://github.com/docker/for-mac/issues/5886

つまりPHP側やXdebug側を色々疑っていたけど全ての原因はDockerだったというわけです。

このページには解決方法も記載されていて、Dockerの設定ファイル(settings.json)でvpnKitMaxPortIdleTimeという変数の値を変更すればいいとのことでした。

解決方法

解決方法です。僕は皆さんのためにWindows版も調べましたよ😁👍

各OSごとにDockerの設定ファイルでsettings.jsonがあるはずなのでそれを開きます。

Windows

C:\Users\[user]\AppData\Roaming\Docker\settings.json

Mac

~/Library/Group\ Containers/group.com.docker/settings.json

そしてこのファイルの中にvpnKitMaxPortIdleTimeという変数があるはずなので、それを任意の値に変更します。

例えば1時間に設定したい場合はこのように書きます。

"vpnKitMaxPortIdleTime": 3600

そしてDockerを再起動します!

僕はこれでXdebugのセッションがちゃんと1時間続くようになりました!!

因みに、Dockerのリリースノートによると、このvpnKitMaxPortIdleTimeという変数はバージョン4.1.0から追加されているようなのでそれより古い場合はこの方法は使えないかもしれません。

本記事は以上となります。

お役に立てたらいいね!又はリツイートをしてください。たぶんこの問題に関しては情報が少なくて困っていたはずだと思うのです。

現場からは以上です!

コメントを残す

メールアドレスが公開されることはありません。