PHP Slim 環境構築(9) 設定ファイル

# PHP Slim 環境構築(9) 設定ファイル

## Introduction

[前回](https://qiita.com/dynamitecoolguy/items/fdb4f0540d4cf191a3da)は、ローカルS3(互換)をdockerで立てて、それにアクセスしてみました。
今回は、設定ファイルなどを少し整理してみます。

## 変更点

### ソースツリー

前回からの変更・追加ソースは以下の通りです。

```
$(PROJECTROOT)
  /compose
    /web_front
      Dockerfile
      local.conf                           (default.confからのrename)
    /web_hoge
      Dockerfile
      php.ini
      settings.php
    docker-compose-common.yml              (docker-compose.ymlからのrename)
    docker-compose-local.yml
  /src
    /hoge
      /public
        index.php
```

### /web_front/Dockerfile

Nginxの設定ファイルを環境(local, developmentなど)毎に変更できるように修正しました。
docker-composeでenvironment, environmentkeyを指定します。
なお、environmentが環境、environmentkeyが環境内の枝番(developement-1とかlocal-hogebranchとか)です。


```dockerFile:/compose/web_front/Dockerfile
FROM nginx:1.17.3

ARG environment

# settings
COPY ${environment}.conf /etc/nginx/conf.d/default.conf

RUN deluser www-data \
    && addgroup --system --gid 1000 www-data \
    && adduser --system --home /var/www --no-create-home --uid 1000 --gid 1000 \
       --disabled-password --disabled-login --shell /usr/sbin/nologin www-data

EXPOSE 3128
EXPOSE 8443
```

### /web_front/local.conf

default.confからrenameしただけで中身は変更していません。

### /web_hoge/Dockerfile

phpの設定と、DB接続情報などを環境毎に変更できるようにしました。
/web_front/Dockerfileと同様に、docker-composeでenvironmentを指定します。

なお、php-fpmの設定は今回変更していませんが、php.iniと同様の方法で、/usr/local/etc/php-fpm.d/zz-overwrite.confなどに設定をコピーするようにすることで設定を変更することもできます。

```dockerfile:/compose/web_hoge/Dockerfile
FROM php:7.3.9-fpm-alpine3.10

ARG environment

...(略)...
# xdebug(2.7.2) extension=xdebug.so
RUN if [ "${environment}" = "local" ]; then \
     pecl install xdebug-2.7.2 \
  && docker-php-ext-enable xdebug \
  && echo "xdebug.remote_enable=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
  && echo "xdebug.remote_connect_back=0" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
  && echo "xdebug.remote_autostart=0" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
  ; fi

# settings
COPY settings.php /var/www/settings.php

# PHP conf
COPY php.ini /usr/local/etc/php/conf.d/php.ini

RUN apk del --purge .build-deps \
  && docker-php-source delete \
  && rm -rf /var/cache/apk/* \
  && rm -rf /tmp/*

...(略)...
```

### /web_hoge/php.ini

エラーログを出力するようにしています。出力先はphp-fpmのデフォルト設定である標準エラー出力になります。
したがって、docker-compose logsコマンドでエラーログを見ることができます。

```ini:/compose/web_hoge/php.ini
[PHP]
log_errors = On
display_startup_errors = On
error_reporting = E_ALL
upload_max_filesize = 256M
```


### /web_hoge/settings.php

/src/hoge/public/index.phpのDIコンテナの設定部分を抜き出しただけです。

```php:/compose/web_hoge/settings.local.php
<?php

return [
    'userdb' => [
        'host' => 'mysql',
        'dbname' => 'userdb',
        'user' => 'scott',
        'password' => 'tiger'
    ],
    'logdb' => [
        'host' => 'postgresql',
        'dbname' => 'logdb',
        'user' => 'root',
        'password' => 'hogehoge'
    ],
    'redis' => [
        'host' => 'redis'
    ],
    'dynamodb' => [
        'endpoint' => 'http://dynamodb:8000',
        'region' => 'ap-northeast-1'
    ],
    'storage' => [
        'endpoint' => 'http://storage:9000',
        'region' => 'ap-northeast-1'
    ]
];
```

### docker-compose-common.yml, docker-compose-local.yml

前までのdocker-compose.ymlを環境依存の部分と非依存の部分で分けました。
そのため、docker-composeコマンドを実行する場合は、以下のように設定ファイルを指定する必要があります
(-fは指定した順序に読み込まれ、後に指定した設定によって上書きされます)。

```shell
$ docker-compose -f docker-compose-common.yml -f docker-compose-local.yml build
```

docker-compose-common.ymlは旧docker-compose.ymlからサーバ名などの部分を取り除いた部分になります。

```yml:/compose/docker-compose-common.yml
version: '3'

services:
  web_front:
    build:
      context: ./web_front
    ports:
      - "80:3128"
      - "443:8443"
    volumes:
      - ../certs:/etc/certs:ro
    container_name: web_front
    networks:
      - private_net

  web_hoge:
    build:
      context: ./web_hoge
    volumes:
      - ../src/hoge:/var/www/hoge
      - ../src/vendor:/var/www/vendor
    container_name: web_hoge
    networks:
      - private_net

  redis:
    build:
      context: ./redis
    volumes:
      - redis-data:/var/lib/redis
    ports:
      - "16379:6379"
    sysctls:
      - net.core.somaxconn=1024
    container_name: redis
    networks:
      - private_net

  mysql:
    build:
      context: ./mysql
    volumes:
      - mysql-data:/var/lib/mysql
    ports:
      - "13306:3306"
    container_name: mysql
    networks:
      - private_net

  postgresql:
    build:
      context: ./postgresql
    volumes:
      - postgresql-data:/var/lib/postgresql
    ports:
      - "15432:5432"
    container_name: postgresql
    networks:
      - private_net

  dynamodb:
    image: amazon/dynamodb-local
    container_name: dynamodb
    ports:
      - "18000:8000"
    networks:
      - private_net

  storage:
    image: minio/minio
    volumes:
      - storage-data:/data
    container_name: storage
    ports:
      - "19000:9000"
    environment:
      MINIO_ACCESS_KEY: minio
      MINIO_SECRET_KEY: miniminio
    command: server /data
    networks:
      - private_net

volumes:
  redis-data:
  mysql-data:
  postgresql-data:
  storage-data:

networks:
  private_net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.28.0.0/24
```

逆に、docker-compose-local.ymlはdocker-compose-common.ymlから取り除かれた部分になります。

```yml:/compose/docker-compose-local.yml
version: '3'

services:
  web_front:
    build:
      args:
        - environment=local
        - environmentkey=

  web_hoge:
    build:
      args:
        - environment=local
        - environmentkey=
    environment:
      XDEBUG_CONFIG: "remote_host=172.28.0.1"
      PHP_IDE_CONFIG: "serverName=hoge.localhost"
    domainname: localhost
```

### index.php

以前のソースで、ContainerBuilder::addDefinitionsを呼び出したとき設定していたsettingsを、外部から呼び出してきてセットするように修正しています。

```php:/src/hoge/public/index.php

...(略)...

/** @var Composer\Autoload\ClassLoader $loader */
$loader = require __DIR__ . '/../../vendor/autoload.php';
$loader->addPsr4('Hoge\\', __DIR__ . '/../lib');

$settings = require __DIR__ . '/../../settings.php';

$containerBuilder = new ContainerBuilder();
$containerBuilder->addDefinitions([
    'settings' => $settings,
    'userdb' => function (ContainerInterface $container) {
```


## ここまでのソース

[こちら](https://github.com/dynamitecoolguy/slimtemplate/tree/chapter9)でどうぞ。