MAMPでPHPのバージョンを .htaccess で切り替えられるようにした
環境
やりたいこと
MAMPでは設定で直近2バージョンのPHPを切り替えられるのだが、この方法だと・・・
- 切り替えられるのは2バージョンのみ
- MAMP環境全体をそのPHPバージョンにしてしまう。「特定のディレクトリのみ特定のPHPバージョンにしたい」とかできない
- 切り替える都度、MAMP(Apache)の再起動が必要になる
という問題がある。よくレンタルサーバーなどでは .htaccess でPHPのバージョンを切り替えられるようになっているが、あれをローカル開発環境のMAMPでもできるようにした、という話。こういうやつ↓
https://blog.heteml.jp/?p=5509
前提となる知識
手順自体は簡単なのだが、前提として必要な知識が欠けてたので時間がかかった。サーバ周りよわよわおじさんです。
- PHP動かすにはモジュール版とCGI版がある。いやー単語だけはよく聞くなー!モジュール版とCGI版。今回はじめてその意味がわかった(?)のだが、前者はApache起動時にロードされる(=なのでバージョン切り替えたらApache再起動が必要)。高速。後者はPHPの実行のたびに呼ばれる。遅い。
- モジュール版のPHPは1つのバージョンしか読み込むことができない。最初試しに httpd.conf でPHPの LoadModule 行を2つに増やして別バージョン読み込ませてみたのだが、Apacheが起動しなくなった。笑
- つまり俺のやりたいことを実現するにはCGI版のPHPを動かすしかない。
- CGI版PHPってのは、php-cgiというファイル名で存在してるらしい。MAMPだと /Applications/MAMP/bin/php/php___VERSION___/bin/php-cgi ってやつ(___VERSION___にはPHPのバージョン番号が入る)。知ったときは「なんだよーお前こんなとこにいたのかよー。名前だけはよく聞いてたけどはじめましてよろしくね。nice to meet you!」という気分になった。
- つまり、「ヘイ, Siri。このディレクトリ配下の拡張子phpのファイルは、LoadModuleで読み込んでるPHPじゃなくて、こっちのCGI版PHP、つまり php-cgi ちゃんを使ってくれーーー!」「ピロリン♪ おっしゃっている意味がよくわかりません」という設定を行えばOKということである。
では、具体的な手順。
① ApacheのCGIディレクトリにCGI版PHPへのシンボリックリンクを作成する
まずはApacheがCGIを実行できる場所(不明な場合 httpd.conf の ScriptAlias 参照)にCGI版PHPを設置する。以下、今回は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の下あたりにしておいた(適当)。①で作ったCGI版PHPを php56-cgi という名前で呼び出すイメージ。
Action php56-cgi /cgi-bin/php56
③ .htaccessの編集
そのバージョンのPHPを動かしたいディレクトリ配下に、.htaccess ファイルを設置し、次の記述を追加する。ちなみに下記では拡張子htmlでもPHPを実行するようにしている。必要なければ「.html」は要らない。
AddHandler php56-cgi .php .html
これで、.htaccess が置かれたディレクトリ配下の拡張子php/htmlのファイルはすべて、php56-cgi(すなわちそれはCGI版PHPであり、ファイル実体としては php-cgi)に引き渡され、めでたくPHPのコードとして処理される。ちなみにそれ以外のディレクトリでは、LoadModule で指定されたPHPバージョンが動く。