Dockerの設定

最初はDockerComposeの設定から。
今回はこんなファイル構成で作ります。

docker-compose.yml
htdocs
└ public
docker-compose
├ php
│  ├ Dockerfile
│  ├ 000-default.conf
│  └ php.ini
└ mysql
   ├ initdb.d
   │  └ 000-default.conf
   ├ Dockerfile
   └ my.cfn

docker-compose.yml

version: "3"

services:
  web:
    container_name: test_php
    build:
      context: ./docker-compose/php
    ports:
      - 8080:80
    volumes:
      - ./htdocs:/var/www/html
    restart: always
  db:
    container_name: test_mysql
    build:
      context: ./docker-compose/mysql
    volumes:
      - ./docker-compose/mysql/initdb.d:/docker-entrypoint-initdb.d
      - test_mysqlvol:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
      TZ: "Asia/Tokyo"
    command: --default-authentication-plugin=mysql_native_password
    ports:
      - 3306:3306
    restart: always
    volumes:
      test_mysqlvol:

phpのDockerfileはComposerとかXdebugとかと使えるようにします。

docker-compose/php/Dockerfile

FROM php:8-apache
COPY php.ini /usr/local/etc/php/
COPY *.conf /etc/apache2/sites-enabled/

RUN apt-get update \
	&& apt-get install -y libzip-dev unzip \
	&& docker-php-ext-install zip pdo_mysql mysqli \
	&& docker-php-ext-enable mysqli \
	&& a2enmod rewrite \
	&& pecl install xdebug \
	&& docker-php-ext-enable xdebug

COPY --from=composer /usr/bin/composer /usr/bin/composer
ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer

何かしらフレームワークを使う場合ドキュメントルートを変更する必要があると思いますが、その時は下記ファイルを作ります。

docker-compose/php/000-default.conf

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html/public

    <Directory /var/www/html/public>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

php.iniにxdebugを追加します。
その他の設定は必要に応じて追加してください。

docker-compose/php/php.ini

# ...

[xdebug]
xdebug.client_host = host.docker.internal
xdebug.client_port = 9003
xdebug.idekey = PHPSTORM
xdebug.mode = debug
xdebug.start_with_request = yes

次はMySQLのDockerfile。
設定ファイルの追加とか権限とか。

docker-compose/mysql/Dockerfile

FROM mysql:8
ADD my.cnf /etc/mysql/conf.d/my.cnf
RUN chmod 644 /etc/mysql/conf.d/my.cnf

my.cnfで文字コードの設定とかしておきます。

docker-compose/mysql/my.cnf

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
	
[client]
default-character-set=utf8mb4

コンテナー構築時にDBにテーブルとか作りたい場合は下記に作ります。

docker-compose/mysql/initdb.d/1_ddl.sql

CREATE DATABASE IF NOT EXISTS dbname;
CREATE DATABASE IF NOT EXISTS dbname_test;

全部できたらコンテナーを構築しましょう。

$ docker-compose up -d

PhpStormでDcokerの設定

環境設定のDocker設定画面の設定をします。
Docker Desctop Macを使用している場合はDocker for Macをチェック。

次はPHPの設定項目

最初はCLIインタープリターはの選択はできない状態だと思うので、左の「…」でポップアップを表示して、「From Docker…」を選択する。

CLIインタープリターポップアップが表示されるので下記のように設定。

PHPのサーバー設定項目

PHPのデバッグ設定項目
おそらく変更に必要はないはず。

XDebugを使う

右上のセレクトボックスから「実行構成の編集…」を選択。

左上の「+」ボタンから「PHPリモートデバッグ」を選択して次のように設定。

デバッグボタンとリッスンボタンをアクティブにする。

あとはデバッグしたい行の左をクリックして赤丸状態にして、ブラウザでアクセスするとデバッグできる。

PHPUnitを使う

Composerでインストールしますが、Dcokerの場合コンテナに入ってインストールします。
PhpStormでは「サービス」のコンテナ名を右クリックして「ターミナルを作成」でコンテナでコマンド叩くことができます。

ターミナルを開いたら下記を実行してインストール。

$ composer require phpunit/phpunit --dev

PHPのテストフレームワーク設定項目画面で、「+」をクリックして、「リモートインタープリターによるPHPUnit」を選択。

設定は次のようにする。

設定ファイル(phpunit.xml)はtestsディレクトリにテストコードを入れるので次のようにしました。

htdocs/phpunit.xml

<?xml version="1.0"?>
<phpunit>
	<testsuite name="Application Test">
		<directory>./tests/</directory>
	</testsuite>
</phpunit>

あとは作成したテストファイルを右クリックメニューから「実行」でテストできる。