かきスタンプ

福岡でフリーランスの物流系のエンジニアやってます。

PHP・Docker:Docker コンテナ起動の PHP にて、pcntl を有効にする方法

<環境>
Laravel のバージョン: 8.16.1
PHP のバージョン: 7.4.7

 
Laravel の特定の機能を使う場合、pcntl(プロセス制御機能)が要求される事があります。

それを使うためにはどうすれば? という事を調べると、「PHPコンパイルしてください」と凄いテンションが上がらない方法が見つかったりする。

PHP公式
PHP: インストール手順 - Manual

PHPがサポートするプロセス制御機能は、デフォルトでは有効となっていません。
プロセス制御機能を有効にするには、configure のオプションに > --enable-pcntl を付け、CGI 版あるいは CLI 版の PHPコンパイルする必要があります。

Stack Overflow
How to enable pcntl in php ( while using a framework like Symfony2 )
How to enable PCNTL on Ubuntu server 16.04 - Stack Overflow

普段、Docker を使って開発しているデベロッパーにとっては、なかなか辛みのある修正。

ですが、別に PHP をリコンパイルせずとも、Dockerfile を編集する事で pcntl(プロセス制御機能)を有効化する事は可能です。

具体的には、以下の記述を追加します。
Docker イメージは、公式配布の php-fpm を使う事を前提としています。

RUN docker-php-ext-configure pcntl --enable-pcntl \
  && docker-php-ext-install \
    pcntl

以下、Dockerfile の編集例。

FROM php:7.4.11-fpm

# install composer
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer
RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim

RUN apt-get update \
    && apt-get install -y libpq-dev \
    && docker-php-ext-install pdo_mysql pdo_pgsql

RUN docker-php-ext-configure pcntl --enable-pcntl \
  && docker-php-ext-install \
    pcntl

WORKDIR /var/www/html

Docker-composer を使っている場合、「docker-compose up -d --build」等のコマンドでリビルド。

pcntl が有効となっているかは、コンテナログイン後に以下のコマンドで確認します。

php -i | grep pcntl

以下の表示があれば、pcntl は有効となっています。

pcntl support => enabled

php コマンドのオプションについては、以下を参照。
PHP: Options - Manual

-m Show compiled in modules

参考サイト
https://github.com/codereviewvideos/docker-php-7/blob/master/Dockerfile

おまけ
一応、こういう方法もあるみたい。
Installing PCNTL module for PHP without recompiling