MacPortsでインストールしたphp4とphp5を共存させたい

ひさびさにphpの作業が入ってきたので、Mac上にテスト環境を整えることにした。
そういえば、以前php4の作業とphp5の作業を同時進行していたときがあって、そのときバージョンの違いに翻弄された記憶がある。どうにか共存させられないものかといろいろ設定してみたけれども面倒くさくなって、MacPortsのactivate/deactivateで切り替えて対処していた。
今後こういった面倒がありそうなので、php4/php5の共存できる環境を作っておきたい。


基本的に、apachephpMacPortsを使ってインストールしたものを使い、システム側で用意されているものは使わないようにしている。システム側は/etc/apache2以下を触ると面倒そうなので。

さて、php4/php5を共存させるには、いろいろ方法があるとは思うものの、とりあえず両方ともCGIとして動作するようにすることにした。

手順はこんな感じ。

MacPortsでapache2をインストール

インストール自体で特に困るところはなし。

実行ファイルとか設定ファイルとかログとかはすべて/opt/local/apache2以下に配置される。特に実行ファイルは/opt/local/apache2/binに格納される。普通ここにはパスを通していないので、/opt/local/apache2/bin/apachectlを実行したつもりが/usr/sbin/apachectlが実行されていたりして、設定を書き換えたのに反映されないとか悩むことになるので注意する。

また、インストール後、自動的に起動するようにlaunchdに登録する。これはMacPortsのインストール後に出てくるメッセージ書いてあるものを実行すればよい。いきなりport install php5とかすると、このメッセージを見逃してしまうことがあるので注意する。

こんな感じのスクリプトを~/binとかに作っておくと楽かも。

load.apache2
#!/bin/sh
sudo launchctl load -w /Library/LaunchDaemons/org.macports.apache2.plist
unload.apache2
#!/bin/sh
sudo launchctl unload -w /Library/LaunchDaemons/org.macports.apache2.plist

それと、システム環境設定の共有ペインで設定できる「Web共有」を切っておく。切っておかないとポートがかぶってどっちかが起動できなくなる。

MacPortsでphp4/php5をインストール

variantで+fastcgiを指定するようにする。そうしないとCGI動作に必要なphp-cgiがインストールされない。こんな感じ。

$ sudo port install php5 +fastcgi +mysql4

2009-05-20時点の最新と思われるMacPortsでは、php4とphp5を問題なくインストールできるようになっている。

例えば、php4の実行ファイルは/opt/local/bin/php4として、php5は/opt/local/bin/phpとしてインストールされる。だいたいphp4側は「4」がpostfixされている感じ。

apacheの設定でScriptAliasを作る

ScriptAliasを/opt/local/binにするのはちょっと怖いので、/opt/local/libexec/local-phpを新しく作って、そこにphp-cgi4/php-cgiのリンクを張ることにした。この辺りちょっと心許ない。

http.conf側はこんな感じ。

<Directory "/opt/local/libexec/local-php">
  AllowOverride None
  Options FollowSymLinks
  Order Allow,Deny
  Allow from localhost
  Allow from 192.0.2.1
</Directory>

ScriptAlias /php-execute/ "/opt/local/libexec/local-php/"

.htaccess側で設定

php4を拡張子.phpで使いたい場合はこんな感じ。

Action application/x-httpd-php /php-execute/php-cgi4
AddType application/x-httpd-php .php

こんな感じで拡張子によってphp4/php5を振り分けもできる。

Action application/x-httpd-php4 /php-execute/php-cgi4
AddType application/x-httpd-php4 .php4

Action application/x-httpd-php5 /php-execute/php-cgi
AddType application/x-httpd-php5 .php5

.htaccessでAction/AddType使えない場合はFileInfoの上書きが禁止されていないかを疑う。

これで一応動いている感じ。ScriptAliasのくだりとかはなんかもっといい方法があるかもしれないけれども、ローカルのテスト環境なのでこのぐらいにしておく。