Apache環境でPHPの複数のバージョンをディレクトリごとに使い分ける

2024年 9月12日 Posted 野々瀨(フロントエンドエンジニア)

Apache環境でPHPの複数のバージョンをディレクトリーごとに使い分ける機会がありましたので、メモとして残しておこうと思います。

前提

ここでは次を前提に説明を行いたいと思います。

はじめに

複数のバージョンを利用には幾つか方法があります。ここではその一つの方法として、通常のモジュール版のPHPとは別にFastCGIのPHP-FPMを使用することによる、複数のバージョンをApacheで同時に扱うことができようにします。

複数バージョンのインストール

まず現状Apacheで有効になっているモジュールのPHPのバージョンを確認します。次のコマンドを実行しApacheで読み込まれているモジュールを確認します。

ls /etc/apache2/mods-enabled

次にバージョンを指定してインストールできるようにリポジトリを追加します。なお、Ubuntuの公式では非推奨とのことですのでご注意ください。

add-apt-repository ppa:ondrej/php

使用するバージョン(ここではPHP 8.0とPHP 7.4)のモジュール版とPHP-FPM、拡張モジュールをそれぞれインストールします。

sudo apt install -y php8.0
sudo apt install -y php8.0-mbstring php8.0-mysql php8.0-zip php8.0-curl php8.0-gd php8.0-xml
sudo apt install -y php8.0-fpm
sudo apt install -y php7.4
sudo apt install -y php7.4-mbstring php7.4-mysql php7.4-zip php7.4-curl php7.4-gd php7.4-xml
sudo apt install -y php7.4-fpm

上記コマンドでは拡張モジュールとしてmbstring、mysql、zip、curl、gd、xmlをインストールしています。インストール可能な拡張モジュールを確認する場合は、次のようにsearchを使用します。

sudo apt search php8.0-*

モジュール版のインストールができたか次のコマンドで確認します。

php8.0 -v
php7.4 -v

PHP-FPMの方は次のコマンドで確認できます。

ls /run/php

PHP-FPMの有効化

次のコマンドで現在、有効になっているApacheのモジュールを確認します。

apachectl -M

一覧に「proxy_fcgi_module」の表示がなければ、次のコマンドで有効にします。

a2enmod proxy_fcgi

次のコマンドでApacheを再起動します。

sudo systemctl restart apache2

ディレクトリーにバージョンを割り当て

PHPのバージョンを切り替えたいディレクトリーに.htaccessファイルを設置します。次の内容を記述します。

<FilesMatch "\.php$">
  SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
</FilesMatch>

FilesMatchディレクティブで処理するファイルを制限します。

SetHandlerディレクティブでプロキシを使用し、指定したバージョンのPHP-FPMで処理します。php7.4-fpm.sockは使用するPHPのバージョンに合わせて番号を調整します。

切り替わっているか確認

phpinfo関数などでPHPのバージョンが切り替わっているかを確認します。

phpinfo();

通常:

通常(PHP 8.2)

.haccessによって切り替わったディレクトリー:

バージョン切り替え(PHP 7.4)

つまずいたこと

対応している中で幾つかつまずいたことがありましたので、こちらも残しておこうと思います。

FilesMatchディレクティブの書き方

.htacessでFilesMatchディレクティブを書きましたが、次のように書くと500エラーが発生してしまいました。

<FilesMatch \.php$>
  ...
</FilesMatch>

何が原因かというと、正規表現の指定に誤りがありました。ダブルクォーテーションが必要だったようで、これがないと500エラーになりました。ダブルクォーテーションが必要な条件が空白以外でもあることに気付きませんでした。

PHP-FPMの実行ファイルの場所

PHP-FPMの実行ファイルの場所がどこか不明でした。私の場合なんとなくここだろうという場所をひたすら探って/run/phpディレクトリーにあることを確認していました。grepコマンドなどで探した方が早かったかもしれませんね。

ApacheのFastCGIモジュール

そもそもApacheの初期状態ではFastCGIが扱えませんでした。a2enmodコマンドで対象モジュールを有効にする必要があったようです。

a2enmod proxy_fcgi

ちなみにa2enmodコマンドの存在も初めて知りました。今まではhttpd.confファイルを直接編集していましたが、こういったコマンドで設定ファイルを編集せずに設定変更できるのは、便利かもしれませんね。

【余談】モジュール版のPHPを切り替える

Apache側で標準に使用されるモジュール版のPHPのバージョンを切り替えたい場合の方法です。

まずa2dismodコマンドで、現行のPHPのバージョンのモジュールを無効にします。

sudo a2dismod php8.2

次にa2enmodコマンドで、切り替えたいPHPのバージョンのモジュールを有効にします。

sudo a2enmod php7.4

最後にApacheを再起動します。

sudo systemctl restart apache2

これで、phpinfo関数などでPHPのバージョンが切り替わっていることを確認できます。

なお、これはApacheで使用するモジュールの切り替えで、CLIの切り替えではありません。CLIを切り替える場合は次のコマンドを実行し、切り替えたい番号を入力することで、CLIのバージョンを切り替えることができます。

sudo update-alternatives --config php