MAMPでPHPのバージョンを .htaccess で切り替えられるようにした

環境

ローカル開発環境での話です。MAMPな環境だけど、それ以外のApache環境でも普通に援用可能な方法と思われる。

  • macOS Catalina
  • MAMP
  • MAMPにはすでに複数バージョンのPHPが入っている前提(= /Applications/MAMP/bin/php/ の中にバージョンごとに別れたPHPフォルダが存在している)

やりたいこと

MAMPでは設定で直近2バージョンのPHPを切り替えられるのだが、この方法だと・・・

  • 切り替えられるのは2バージョンのみ
  • MAMP環境全体をそのPHPバージョンにしてしまう。「特定のディレクトリのみ特定のPHPバージョンにしたい」とかできない
  • 切り替える都度、MAMPApache)の再起動が必要になる

という問題がある。よくレンタルサーバーなどでは .htaccessPHPのバージョンを切り替えられるようになっているが、あれをローカル開発環境のMAMPでもできるようにした、という話。こういうやつ↓
https://blog.heteml.jp/?p=5509

前提となる知識

手順自体は簡単なのだが、前提として必要な知識が欠けてたので時間がかかった。サーバ周りよわよわおじさんです。

  • PHP動かすにはモジュール版とCGI版がある。いやー単語だけはよく聞くなー!モジュール版とCGI版。今回はじめてその意味がわかった(?)のだが、前者はApache起動時にロードされる(=なのでバージョン切り替えたらApache再起動が必要)。高速。後者はPHPの実行のたびに呼ばれる。遅い。
  • モジュール版のPHPは1つのバージョンしか読み込むことができない。最初試しに httpd.conf でPHPの LoadModule 行を2つに増やして別バージョン読み込ませてみたのだが、Apacheが起動しなくなった。笑
  • つまり俺のやりたいことを実現するにはCGI版のPHPを動かすしかない。
  • CGIPHPってのは、php-cgiというファイル名で存在してるらしい。MAMPだと /Applications/MAMP/bin/php/php___VERSION___/bin/php-cgi ってやつ(___VERSION___にはPHPのバージョン番号が入る)。知ったときは「なんだよーお前こんなとこにいたのかよー。名前だけはよく聞いてたけどはじめましてよろしくね。nice to meet you!」という気分になった。
  • つまり、「ヘイ, Siri。このディレクトリ配下の拡張子phpのファイルは、LoadModuleで読み込んでるPHPじゃなくて、こっちのCGIPHP、つまり php-cgi ちゃんを使ってくれーーー!」「ピロリン♪ おっしゃっている意味がよくわかりません」という設定を行えばOKということである。

では、具体的な手順。

ApacheCGIディレクトリにCGIPHPへのシンボリックリンクを作成する

まずはApacheCGIを実行できる場所(不明な場合 httpd.conf の ScriptAlias 参照)にCGIPHPを設置する。以下、今回はPHP5.6.31という古いバージョンを使いたかったので、そのような記述になっている。

$ cd /Applications/MAMP/cgi-bin/ # ApacheのCGIディレクトリ
$ ln -s /Applications/MAMP/bin/php/php5.6.31/bin/php-cgi php56 # php56という名前でCGI版PHPへのシンボリックリンクを作成
$ chmod 755 php56 # CGI版PHPを実行可能にする

httpd.conf の編集

httpd.conf に次の行を追記。場所はとりあえず元のPHPのLoadModuleの下あたりにしておいた(適当)。①で作ったCGIPHPを php56-cgi という名前で呼び出すイメージ。

Action php56-cgi /cgi-bin/php56

.htaccessの編集

そのバージョンのPHPを動かしたいディレクトリ配下に、.htaccess ファイルを設置し、次の記述を追加する。ちなみに下記では拡張子htmlでもPHPを実行するようにしている。必要なければ「.html」は要らない。

AddHandler php56-cgi .php .html

これで、.htaccess が置かれたディレクトリ配下の拡張子php/htmlのファイルはすべて、php56-cgi(すなわちそれはCGIPHPであり、ファイル実体としては php-cgi)に引き渡され、めでたくPHPのコードとして処理される。ちなみにそれ以外のディレクトリでは、LoadModule で指定されたPHPバージョンが動く。

以上、.htaccessで気軽にPHPバージョンの切り替えが行われることをかくにん!よかった!