edo1z blog

プログラミングなどに関するブログです

Dockerとphpstormでxdebugを使う

環境

  • Ubuntu18.04
  • Docker (php7.2, apache2)
  • PhpStorm
  • Chrome

設定方法の概要

  • phpのサーバに、xdebugをインストール
  • php.iniをxdebugが利用できるように設定する
  • phpstormを設定する

設定方法詳細

参考

qiita.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に全然違うアドレス書いてても、無視して今アクセスしているところにアクセスするっぽい。

参考

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を削除)

参考

blog.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にしているので、ブラウザ拡張をインストールして、デバッグ有効にしないと実際にはデバッグされないと思います。ブラウザ拡張は下記にあります。

www.jetbrains.com