INFRA

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%8Bqiita.com

Dockerfile

RUN pecl install xdebug を追加しました。全体は下記のような感じになっております。

FROM php:7.2.16-apache
MAINTAINER docker-web
RUN apt-get update && apt-get -y install vim wget tree zsh zip ffmpeg
RUN 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 gd
RUN ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/rewrite.load
RUN ln -s /etc/apache2/mods-available/vhost_alias.load /etc/apache2/mods-enabled
RUN echo ServerName $HOSTNAME > /etc/apache2/conf-available/fqdn.conf && a2enconf fqdn
RUN a2enmod headers
RUN a2enmod include
COPY ./apache2.conf /etc/apache2/apache2.conf
COPY ./localhost.conf /etc/apache2/sites-available/000-default.conf
COPY ./php.ini /usr/local/etc/php/
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

php.ini

  • 参考サイトに記載されていますが、dockerの場合、外部への接続先は、host.docker.internalで表せるようです。
  • xdebug.soの場所は、 find / -name xdebug.soで探せます。
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = UTF-8
mbstring.language = Japanese
upload_max_filesize = 500M
memory_limit = 500M
post_max_size = 500M
[xdebug]
zend_extension = /usr/local/lib/php/extensions/no-debug-non-zts-20170718/xdebug.so
xdebug.remote_enable = 1
xdebug.remote_autostart = 0
xdebug.remote_connect_back = 1
xdebug.remote_host = host.docker.internal
xdebug.remote_port = 9000
xdebug.remote_log = /tmp/xdebug.log

phpstromの設定

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/3471blog3.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-macblog.shin1x1.com

Dockerfile

pecl install xdebug だけではなく、下記を追加した。

RUN pecl install xdebug \
&& docker-php-ext-enable xdebug

php.ini

[xdebug]
xdebug.remote_enable = 1
xdebug.remote_autostart = 0
xdebug.remote_connect_back = 1
xdebug.remote_port = 9000
xdebug.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.htmlwww.jetbrains.com