CakePHP3アプリケーションをPHP7.3で動かす

1人AdventのDay-18です。

adventar.org

手元で作っていたアプリケーションをPHP7.3に乗せて見たので、その時の内容を晒してみようというのが今回の目論見です。
ちゃちゃっと。

構成について

Herokuで動くようにしています。
ということで、以前に作成したPHP7.2用のイメージをベースにしました。
o0ho0h/heroku-php72-fpm - Docker Hub

これについては、以前まとめたものです。

daisuki.nichiyoubi.land

ファイルの内容

こんな感じになっております

 $ tree -L 2
.
├── Dockerfile
├── README.md
├── app
│   ├── README.md
│   ├── bin
│   ├── composer.json
│   ├── composer.lock
│   ├── config
│   ├── index.php
│   ├── logs
│   ├── phpunit.xml.dist
│   ├── plugins
│   ├── src
│   ├── tests
│   ├── tmp
│   ├── vendor
│   └── webroot
├── composer
└── docker-compose.yml
$ cat .docker/etc/nginx/conf.d/default.conf
server {
  listen __NGINX_LISTEN_PORT__;
  server_name _;

  root /var/www/html/app/webroot;
  index index.php;

  location / {
    try_files $uri $uri/ /index.php?$args;
  }

  location ~ \.php$ {
    try_files $uri =404;
    include fastcgi_params;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_intercept_errors on;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }
}
$ cat .docker/usr/local/etc/php/conf.d/xdebug.ini
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20180731/xdebug.so
xdebug.remote_enable = On
xdebug.remote_autostart = On
xdebug.remote_host = docker.for.mac.localhost
xdebug.idekey = PHP_XDEBUG_IDE_KEY_HERE
FROM php:7.3-fpm-alpine

RUN apk add nginx supervisor \
    && mkdir -p /etc/supervisor.d/

RUN apk add \
    vim \
    git \
    zsh

RUN apk add --no-cache \
  libgcc \
  libtool \
  pkgconfig \
  re2c \
  libressl \
  xdg-utils \
  openssh-client \
  ca-certificates

RUN apk add  --virtual build-dependencies \
  autoconf \
  automake \
  make \
  gcc \
  g++ \
  libmcrypt-dev \
  zlib-dev \
  gmp-dev \
  libzip-dev \
  libxslt-dev \
  icu-dev \
  libmcrypt-dev \
  libressl-dev

# php7
WORKDIR /usr/src/php/ext
RUN git clone https://github.com/xdebug/xdebug
RUN NPROC=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || 1) \
  && docker-php-ext-install -j${NPROC} \
  intl \
  xdebug \
  zip

RUN docker-php-ext-enable \
  #opcache \
  xdebug \
  && docker-php-source delete

# setup web
COPY .docker/supervisor.programs.ini /etc/supervisor.d/

COPY .docker/etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf
fpm.d/www.conf
RUN rm /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini

COPY .docker/run.sh /
RUN chmod a+x /run.sh
RUN adduser -D myapp \
    && apk add --update sudo \
    && echo "myapp ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

 COPY ./ /var/www/html


 WORKDIR /var/www/html
CMD ["/run.sh"]
$ cat docker-compose.yml
version: '3'
services:
    web:
      build: .
      ports:
        - "9002:8888"
      volumes:
        - ./:/var/www/html
        - .docker/usr/local/etc/php/conf.d/xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini

これで、「xdebugの有効なPHP7.3でCakePHPを動かす」ができると思います。

xdebugについて

Dockefile内でxdebug.inをrmすることで、xdebugを無効にしています。
その上で(localでのみ使う想定の)docker-composeではiniファイルをマウントさせており、これによって「xdebugの有効・無効を環境に応じて切り替える」ということをしています。

opcache

ちょっと問題がある?っぽく、opcacheは無効化しています・・・
最初はうまくいかなかったのですが、外してみたら無事にPHPを動作させることができました。はて・・・

まとめ

今日はかなりさっくりです!!
これだけで、簡単にherokuにCakeアプリケーションを放り込めるかな〜と思います。
あとでGitHub/Dockerhubにあげる!