今回の環境です。
-
- OS:Almalinux
- PHP:PHP-FPM(元々入っていたバージョンは7.3)
- Virtualminで仮想ホストを使用
以下の要件がありました。
- ドキュメントルート直下にサブディレクトリを作成
- サブディレクトリについては異なるバージョンのPHPを実行したい(AというCMSはPHP7.3でないと動作しないがBというCMSは可能であれば最新のPHPで実行させたい、のようなケースです。)
CGIの場合は、Virtualminではサブディレクトリ単位に実行するPHPのバージョンが選択可能でしたが、PHP-FPMの場合はそれができません・・・。
【画像参考】※CGIだとサブディレクトリごとにPHPバージョンが選択できます。
どうしたらいいものかと思っていたところ、有識者の方からご助言を頂き、どうも.htaccessで切り替え可能との事。
ローカル環境で試してみました。
1)異なるバージョンのPHPのインストール
先程書いたように、元々入っていたPHPのバージョンは7.3だったのですが、8.0と8.1を入れてみます。SSHでログインして、コマンドを実行してインストールを行います。
remiリポジトリが入っていない場合はインストールとキャッシュクリアを実行します。
. /etc/os-release && dnf -y install https://rpms.remirepo.net/enterprise/remi-release-$(rpm -E %$ID).rpm && dnf clean all
PHPをインストールします。
dnf install php81-php-{cli,fpm,pdo,gd,mbstring,mysqlnd,opcache,curl,xml,zip}
phpXXのXXはバージョン、{}で必要なモジュールを入れます。
ここでWebminのサーバステータスを確認します。
それぞれのPHP-FPMサーバが実行されています。また、Virtualminのサーバ設定 > PHPオプション画面でもインストールした複数のバージョンが選択可能な状態になっています。
2)ディレクトリごとのPHPバージョンを変更する
今回の場合、以下のようにしようとしています。
document root ← 元々のPHPバージョン | ー directory A ← 元々のPHPバージョン | ー directory B ← 異なるPHPバージョン(PHP8.0にします。)
PHPバージョンごとに異なるソケットが使用されるので、特定のディレクトリについて、.htaccessで特定のPHPバージョンのソケット通信を許可するようにさせる方法になります。
まずはソケットの場所を確認します。
cd /etc/opt/remi/php80/
view www.conf
そうすると
listen = /var/opt/remi/php80/run/php-fpm/www.sock
ここにソケットのファイルが存在することが確認できましたので、次に、directory Bに .htaccess を設置します。
.htaccess は以下の内容です。
<FilesMatch \.(php|phar|html)> SetHandler "proxy:unix:/var/opt/remi/php80/run/php-fpm/www.sock|fcgi://localhost </FilesMatch>
先程確認したソケットを使用するように記述しています。
設置後に、directory Bでphpinfo()を表示させてみます。
PHP8.0ですね!
よかったよかった〜。