Dockerとphpstormでxdebugを使う
環境
- Ubuntu18.04
- Docker (php7.2, apache2)
- PhpStorm
- Chrome
設定方法の概要
- phpのサーバに、xdebugをインストール
- php.iniをxdebugが利用できるように設定する
- phpstormを設定する
設定方法詳細
参考
https://qiita.com/castaneai/items/d5fdf577a348012ed8af#%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B — qiita.com
Dockerfile
RUN pecl install xdebug を追加しました。全体は下記のような感じになっております。
FROM php:7.2.16-apacheMAINTAINER docker-web
RUN apt-get update && apt-get -y install vim wget tree zsh zip ffmpegRUN apt-get -y install lsb-release libicu-dev mysql-client \ libfreetype6-dev libpng-dev libjpeg62-turbo-dev -qy \ && apt-get clean \ && rm -rf /var/lib/apt/lists/ */tmp/* /var/tmp/*
RUN pecl install xdebug
RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install pdo_mysql mysqli intl gdRUN ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/rewrite.loadRUN ln -s /etc/apache2/mods-available/vhost_alias.load /etc/apache2/mods-enabledRUN echo ServerName $HOSTNAME > /etc/apache2/conf-available/fqdn.conf && a2enconf fqdnRUN a2enmod headersRUN a2enmod include
COPY ./apache2.conf /etc/apache2/apache2.confCOPY ./localhost.conf /etc/apache2/sites-available/000-default.confCOPY ./php.ini /usr/local/etc/php/
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composerphp.ini
- 参考サイトに記載されていますが、dockerの場合、外部への接続先は、
host.docker.internalで表せるようです。 - xdebug.soの場所は、
find / -name xdebug.soで探せます。
[Date]date.timezone = "Asia/Tokyo"
[mbstring]mbstring.internal_encoding = UTF-8mbstring.language = Japanese
upload_max_filesize = 500Mmemory_limit = 500Mpost_max_size = 500M
[xdebug]zend_extension = /usr/local/lib/php/extensions/no-debug-non-zts-20170718/xdebug.soxdebug.remote_enable = 1xdebug.remote_autostart = 0xdebug.remote_connect_back = 1xdebug.remote_host = host.docker.internalxdebug.remote_port = 9000xdebug.remote_log = /tmp/xdebug.logphpstromの設定
serverとdebug configurationを一応設定していたのですが、remote_connect_back = 1にして、デバッグをしようとしたら、勝手に新しいserverが作成されました。しかも、debug configurationは、削除しても問題なくデバッグが動作しました。ただ、serverについては、path mappingsで、webrootのパスを入力しておかないとエラーでデバッグが動作しませんでした。
なんか、remote_connect_backを1にすると、webサーバにアクセスしているクライアントのipaddressにアクセスしてくれるっぽい。つまり、remote_hostに全然違うアドレス書いてても、無視して今アクセスしているところにアクセスするっぽい。
参考
http://blog3.logosware.com/archives/3471 — blog3.logosware.com
$SERVER[‘HTTP_X_FORWARDED_FOR’] か $ SERVER[‘REMOTE_ADDR’] の値に対してポート9000で通信するようです
なので、ブラウザ画面で動かしたものをデバッグする場合は、remote_connect_backで問題ないけど、ブラウザを使わない系だと使えないっぽい。
さらにシンプルにできるか試してみる
- remote_connect_back = 1にする前提で、remote_hostを削除
- Dockerfileに
docker-php-ext-enable xdebugを追加して、php.iniのzend_extensionを削除 - phpStormの設定を全部削除(serverとdebug configurationを削除)
参考
https://blog.shin1x1.com/entry/setup-test-and-debug-on-phpstorm-and-docker-for-mac — blog.shin1x1.com
Dockerfile
pecl install xdebug だけではなく、下記を追加した。
RUN pecl install xdebug \ && docker-php-ext-enable xdebugphp.ini
[xdebug]xdebug.remote_enable = 1xdebug.remote_autostart = 0xdebug.remote_connect_back = 1xdebug.remote_port = 9000xdebug.remote_log = /tmp/xdebug.log結果
xdebugが動きました。phpstormのserverは勝手にlocalhostという名前のものが作られて、今回は勝手にpath mappingも登録されていました。(前回のキャッシュ的なものが残ってたのかも)
補足
上記のphp.iniだと、remote_autostart = 0にしているので、ブラウザ拡張をインストールして、デバッグ有効にしないと実際にはデバッグされないと思います。ブラウザ拡張は下記にあります。
https://www.jetbrains.com/help/phpstorm/browser-debugging-extensions.html — www.jetbrains.com