こんにちは。技術部の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とかを使った方が楽ちん確実に切り替えられるんじゃ・・・。