vagrant+virtualbox+ubuntu上のdocker上のphp+apacheのxdebug+vscodeについてハマったメモ

## 概要

dockerでphp5.4の開発環境を作ったメモ。古い環境での開発は面倒ですね。
vscodeにphp debugをいれてデバッグ実行。
デバッグポイントで止まらなくてハマったが、以下の記事で紹介されていた方法で解決。
[VisualStudioCodeのデバッグでどうしてもブレークで止まらない場合 (PHP Xdebug)][*11]

※2018/09/06 追記
この情報は古くなっている場合があります。 最新の環境だとXdebug動きませんでした。
新しい環境で動かしたみた記事はこちら [→ xdebug+nginx+vscode](https://qiita.com/hibohiboo/items/711581b3dae3c33536d5)

## 動作環境

* windows10
* vagrant2.0.2
* virtualbox5.1.26
* ubuntu-16.04
* Docker version 17.09.0-ce, build 19e2cf6
* docker-compose version 1.18.0, build 8dd22a9

## 構造

```yaml
project
  - .vscode
    - launch.json
  + server # Docker用ファイル
  + src    # phpソースファイル
  + logs   # ログ・ファイル
  - docker-compose.yml
```

## 設定

### ホスト:Visual Studio Code の PHP DEBUGの設定

`"stopOnEntry": true,`の設定がないとステップ実行できなかった。

```json:.vscode/launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Listen for XDebug",
      "type": "php",
      "request": "launch",
      "port": 9000,
      "stopOnEntry": true,
      "log": true,
      "pathMappings": {
          "/var/www/html": "${workspaceRoot}/src"
      }
    }
  ]
}
```
### ゲスト： apacheサーバの設定

```dockerfile:server/apache/Dockerfile
FROM php:5.4-apache

# Apacheモジュールインストール
RUN a2enmod rewrite

# PHPモジュールインストール
RUN docker-php-ext-install mbstring
RUN docker-php-ext-install mysql


# Install xdebug for php debugging
RUN apt-get update
RUN apt-get install -y php-pear
RUN pecl install xdebug-2.4.1

RUN echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)" > /usr/local/etc/php/conf.d/xdebug_settings.ini \
    && echo "debug.default_enable = 1" >> /usr/local/etc/php/conf.d/xdebug_settings.ini \
    && echo "xdebug.remote_enable=on" >> /usr/local/etc/php/conf.d/xdebug_settings.ini \
    && echo "xdebug.remote_autostart=on" >> /usr/local/etc/php/conf.d/xdebug_settings.ini \
    && echo "xdebug.remote_connect_back = on" >> /usr/local/etc/php/conf.d/xdebug_settings.ini \
    && echo "xdebug.remote_log = /var/log/apache2/xdebug.log" >> /usr/local/etc/php/conf.d/xdebug_settings.ini

# php設定
RUN echo '\
date.timezone = "Asia/Tokyo"\n\
memory_limit = -1\n\
' >> /usr/local/etc/php/php.ini

# PHPのログを出力
# error_log = /dev/stderr\n\
RUN echo '\
log_errors = On\n\
error_log = /var/log/apache2/php.log\n\
error_reporting = E_ALL\n\
display_errors = On\n\
' >> /usr/local/etc/php/conf.d/docker.ini

# apacheのログを出力
RUN echo '\
CustomLog /var/log/apache2/access.log combined \n\
ErrorLog /var/log/apache2/error.log\n\
LogLevel warn\n\
' >> /etc/apache2/conf-enabled/log.conf
```

```yaml:docker-compose.yml
version: "3"
services:
  # サーバー
  php: 
    build: ./server/apache
    volumes:
      - ./src:/var/www/html
      - ./logs:/var/log/apache2
    ports: 
      - "80:80"
```

[この時点のソース](https://github.com/hibohiboo/develop/blob/2fe1b0cadeb40834aac69ceaa354978e943a7bd2/tutorial/lesson/php-5.4/)

vscodeを起動して、デバッガを起動しておく。
apacheを立ち上げて、表示されたページにブラウザからアクセスするとステップ実行可能。
`"stopOnEntry": true,`により、デバッグポイントがなくても、ファイルの最初でストップする。

## おまけ

PHP7 + nginx でも同様に設定できた。

```dockerfile:server/php7/Dockerfile
FROM php:7-fpm
RUN apt-get update 
RUN docker-php-ext-install pdo_mysql

RUN pecl install xdebug

RUN echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)" > /usr/local/etc/php/conf.d/xdebug_settings.ini \
    && echo "debug.default_enable = 1" >> /usr/local/etc/php/conf.d/xdebug_settings.ini \
    && echo "xdebug.remote_enable=on" >> /usr/local/etc/php/conf.d/xdebug_settings.ini \
    && echo "xdebug.remote_autostart=on" >> /usr/local/etc/php/conf.d/xdebug_settings.ini \
    && echo "xdebug.remote_connect_back = on" >> /usr/local/etc/php/conf.d/xdebug_settings.ini


# PHPのログを出力
# error_log = /dev/stderr\n\
RUN echo '\
log_errors = On\n\
error_log =/dev/stderr\n\
error_reporting = E_ALL\n\
display_errors = On\n\
' >> /usr/local/etc/php/conf.d/docker.ini
```

[この時点のソース](https://github.com/hibohiboo/develop/tree/6ded298190f7fe37f3d57e94c5f674482c36cb1a/tutorial/lesson/php)


## 参考

[Docker for Mac の PHPStorm で Xdebug を行う][*1]
[Dockerで古いPHP(5.x)のXdebugを組み込んだデバッグ環境を構築する][*2]
[PHP開発者がいまさら聞けない、Xdebugの基礎の基礎][*3]
[PHP5.4に対応するXdebugは2.4.1][*4]
[vscode-php-debug][*5]
[UbuntuへのPECL xdebugインストール][*6]
[vagrant:ubuntu + docker + nginx + xdebug][*7]
[【Xdebug】Windows 7のVagrant でリモートデバッグできない問題][*8]
[VS CodeのDebug Extension設定について][*9]
[XDEBUG EXTENSION FOR PHP | DOCUMENTATION][*10]
[VisualStudioCodeのデバッグでどうしてもブレークで止まらない場合 (PHP Xdebug)][*11]
[VSCodeでPythonをデバッグする][*12]
[xdebug-php.md][*13]
[nginx+php7.0+xdebugインストールではまったこと][*14]
[UbuntuのPHP開発環境][*15]
[Vagrant上のPHPを Xdebug + NetBeans（おまけでVisual Studio Codeでも）でリモートデバッグする][*16]

[*1]:http://blog3.logosware.com/archives/3471
[*2]:https://qiita.com/gcoka/items/c2801a20496851e3ace6
[*3]:https://www.webprofessional.jp/getting-know-love-xdebug/
[*4]:https://qiita.com/khsk/items/7f16c9fc038bc610828c
[*5]:https://github.com/felixfbecker/vscode-php-debug
[*6]:http://flyfront.blog.shinobi.jp/php%E5%85%A8%E8%88%AC/ubuntu%E3%81%B8%E3%81%AEpecl%20xdebug%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB
[*7]:https://gist.github.com/stopsopa/c57874a6790546e76d0bde12a8e5c265
[*8]:http://bashalog.c-brains.jp/15/02/05-200000.php
[*9]:https://qiita.com/north100/items/4cbd536b133ddd2de8d7
[*10]:https://xdebug.org/docs/remote#communcation
[*11]:https://qiita.com/rrryutaro/items/c08f667f20de6abf482f
[*12]:https://qiita.com/bigengelt/items/780440a146e6a3bdffd4
[*13]:https://gist.github.com/ankurk91/22e4a07be552790a9d6a063ee1bace05
[*14]:https://qiita.com/croso/items/759f0de1b257a075f826
[*15]:https://qiita.com/ijoji/items/b86f892fbafd3f397530
[*16]:https://yoshinorin.net/2016/09/14/vagrant-php-xdebug/