PHP5.3とPHP5.2を切り替えて使う方法

こんにちは。技術部のnagata(@handlename)です。

毎年夏風邪引いてるんですが、今年も例年に違わずばっちり熱出してます。 もはや習慣なので気にせず記事を書いていきますよ!

PHP5.2とPHP5.3

現在、開発環境としてMacを使っています。

開発に使用するPHP環境はMacに最初から入っているものではなくて、 macportsから入れたものを使っています。 その方が後からモジュールを足すのが簡単だからです。

さて、その場合インストールされるPHPのバージョンは5.3となります(2010/08/22現在)。 が、過去の案件にはPHP5.2で書かれたものが数多くあります。 新しい案件でもサーバーで利用できるPHPのバージョンが5.2であることも珍しくありません。

PHP5.2から5.3では結構大きな変更があり、PHP5.2のプロジェクトはPHP5.3では うまく動かないことがあります。

そんなときは両方とも開発環境に入れてしまえば万事解決です。

PHP5.2と5.3を同時に使いたい場合はApacheを2つ入れて、 片方はPHP5.2を、もう片方は5.3を使うという方法もあるみたいですが、 今回はひとつのApacheからPHPを切り替えて使うという方法をとりたいと思います。

PHP5.2をソースからインストール

PHP5.3はmacports(Macでない場合はその環境ののパッケージマネージャなど)で すでにインストールしてあるものとします。 この状態に新しくPHP5.2をインストールするわけです。

www.php.netからPHP5.2のソースをダウンロードしてきて、解凍します。

$ wget http://jp2.php.net/get/php-5.2.14.tar.bz2/from/jp.php.net/mirror
$ tar xzvf php-5.2.14.tar.bz2

configureはこんな感じで行います。

$ cd php-5.2.14
$ ./configure \
--prefix=/usr/local/php-5.2.13 \
--mandir=/usr/local/php-5.2.13/share/man \
--infodir=/usr/local/php-5.2.13/share/info \
--with-config-file-path=/usr/local/php-5.2.13/etc/php5 \
--with-config-file-scan-dir=/usr/local/php-5.2.13/var/db/php5 \
--enable-bcmath \
--enable-ctype \
--enable-dom \
--enable-filter \
--enable-hash \
--enable-json \
--enable-libxml \
--enable-mbstring \
--enable-pdo \
--enable-session \
--enable-simplexml \
--enable-tokenizer \
--enable-xml \
--enable-xmlreader \
--enable-xmlwriter \
--with-bz2=/opt/local \
--with-gd=/opt/local \
--with-mcrypt=/opt/local \
--with-mhash=/opt/local \
--with-mysql=/opt/local \
--with-pdo-mysql=/opt/local \
--with-pcre-regex=/opt/local \
--with-readline=/opt/local \
--with-libxml-dir=/opt/local \
--with-zlib=/opt/local \
--without-pear \
--disable-cgi \
--with-ldap=/usr \
--with-apxs2=/opt/local/apache2/bin/apxs

prefixにはPHP5.2専用のパスを指定しておきます。 必要・不要なオプションがあれば、適宜追加&削除してください。

ぼくやった場合はこのままではエラーが出てコンパイルが成功しなかったので、 configureとext/iconv/iconv.cを次のように書き換えました。

# configure

# 72399行目を書き換え
LIBS=`echo $LIBS | sed "s/-l //g"`

# 72407行目に挿入
PDO_MYSQL_LIBNAME=mysqlclient
# iconv.c

iconv_open  # => libiconv_open に書き換え
iconv_close # => libiconv_close に書き換え

この後make&installするわけですが、一つ注意点があります

make installすると、

/opt/local/apache2/modules/libphp5.so

というファイルが作られますが、 なにもしないと元からあるPHP5.3のファイルが上書きされてしまいます。 そこで、元からあるlibphp5.soをlibphp53.soのようにリネームしておきます。

$ cd /opt/local/apache2/modules
$ mv libphp5.so libphp53.so

その後、make & make install します。

$ cd (phpを解凍したディレクトリ)
$ make
$ sudo make install

新しいlibphp5.soが作られているので、 わかりやすいようにlibphp52.soとリネームしておきます。 このときすでにhttpd.confには

LoadModule php5_module modules/libphp5.so

という行が追加されているはずです。 PHP5.3をインストールしたときにも追加されるので、同じ行が2行あるはずです。 両方あるとApacheの起動時にWarningが出てしまうので、片方は消しておきましょう。 この部分でロードするモジュールを切り替えることで、 Apacheから使用するPHPを切り替えるわけです。

PHP5.3を使う場合は、

LoadModule php5_module modules/libphp53.so

PHP5.2を使う場合は、

LoadModule php5_module modules/libphp52.so

とするわけですね。 設定を書き換えたらApacheを再起動してphpinfoを確認してみてください。 PHPのバージョンが切り替わっていると思います。

もっと便利に

さて、めでたくPHPの切り替えに成功したわけですが、 いちいち設定ファイルをいじるのは面倒ですし危険です。 この際コマンド一発でスイッチできるようにしてしまいましょう。

今回はこんなシェルスクリプトを作成しました。 ~/bin に実行権限をつけて置いておきます。

#!/bin/sh

if [ $# -ne 1 ]
then
    echo "Usage : switchphp [version]"
    echo "        version = [52|53]"
    exit
fi

cd /opt/local/apache2/conf/switch

if [ $1 -eq 52 ]
then
    echo "switch to php52"
    sudo cp php52.conf php.conf
    sudo apachectl restart
elif [ $1 -eq 53 ]
then
    echo "switch to php53"
    sudo cp php53.conf php.conf
    sudo apachectl restart
else
    echo "invalid argument $1"
    exit
fi

echo "done"

また、httpconfでPHPのモジュールをロードしていた部分を

Include conf/switch/php.conf

に置き換えておきます。

さらに、/opt/local/apache2/conf/switch には異なるPHPモジュールをロードする設定を書いておきます。

#php52.conf

LoadModule php5_module modules/libphp52.so
#php53.conf

LoadModule php5_module modules/libphp53.so

この2つの設定ファイルのうちどちらかを /opt/local/apache2/conf/switch/php.conf にコピーして読み込むことによって PHPの切り替えを実現しています。

PHP5.2を使う場合

$ ~/bin/phpswitch 52

PHP5.3を使う場合

$ ~/bin/phpswitch 53

おわり

こんな感じで楽々PHP切り替え生活を満喫している次第です。 あれ、もしかして、MAMPとかXAMMPとかを使った方が楽ちん確実に切り替えられるんじゃ・・・。

カヤックではよりよい開発環境を追い求める技術者も募集しています!