環境
- Ubuntu18.04
- Docker (php7.2, apache2)
- PhpStorm
- Chrome
設定方法の概要
- phpのサーバに、xdebugをインストール
- php.iniをxdebugが利用できるように設定する
- phpstormを設定する
設定方法詳細
参考
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に全然違うアドレス書いてても、無視して今アクセスしているところにアクセスするっぽい。
参考
$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を削除)
参考
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にしているので、ブラウザ拡張をインストールして、デバッグ有効にしないと実際にはデバッグされないと思います。ブラウザ拡張は下記にあります。