複数バージョンの PHP を共存させる

微妙に乗り遅れ気味なのですが、最近 PHP 関係のブログでプチ流行だったので、僕の場合の方法を紹介します。

Apache + CLI

メイン環境 + コマンドラインでバージョンごとの挙動の違いを確認するための環境。
ApacheMac OS X 標準の Apache 1.3.33。
PHP 5.1.2 は /usr/local に cli + mod_php5。PHP 4.4.2 と PHP 5.0.5 は cli だけで、prefix を変えてインストール。シンボリックリンクを使う代わりに --bindir と --program-suffix を変えている。
lib に php.ini を置くのは気持ち悪いので etc。PEAR も lib/php ではなく FreeBSD 風に share/pear

PHP 5.1.2
%cat mk-php51.sh
prefix=/usr/local
./configure --prefix=${prefix} --mandir=${prefix}/share/man \
 --with-config-file-path=${prefix}/etc \
 --with-config-file-scan-dir=${prefix}/etc/php \
 --with-pear=${prefix}/share/pear \
 --with-apxs=/usr/sbin/apxs \
(中略)
&& make && make test
PHP 5.0.5
%cat mk-php50-cli.sh
#!/bin/sh
prefix=/usr/local/php-5.0
CC="/usr/bin/gcc-3.3" CPP="/usr/bin/cpp-3.3" CXX="/usr/bin/g++-3.3" \
\
./configure --prefix=${prefix} --mandir=${prefix}/share/man \
 --bindir=/usr/local/bin --program-suffix="-5.0" \
 --with-config-file-path=${prefix}/etc \
 --without-pear --disable-cgi --enable-cli \
(中略)
&& make && make test
PHP 4.4.2
%cat mk-php44-cli.sh
#!/bin/sh
prefix=/usr/local/php-4.4
./configure --prefix=${prefix} --mandir=${prefix}/share/man \
 --bindir=/usr/local/bin --program-suffix="-4.4" \
 --with-config-file-path=${prefix}/etc \
 --without-pear --disable-cgi --enable-cli \
(中略)
&& make && make test

Lighttpd + FastCGI

Web アプリでバージョンごとの挙動の違いを確認するための環境。
lighttpd 1.4.10 は 終了時に FastCGI のソケットを削除しないバグがあるので 1.4.9 を使用。
PHP 4.4.2: 8044 番、PHP 5.0.5: 8050 番、PHP 5.1.2: 8051 番と、ポート番号を変えて lighttpd を複数起動。

mk-php{44,50,51}-fcgi.sh
% cat mk-php51-fcgi.sh
#!/bin/sh
prefix=${HOME}/Applications/php51-fcgi
./configure --prefix=${prefix} --mandir=${prefix}/share/man \
 --with-config-file-path=${prefix}/etc \
 --with-config-file-scan-dir=${prefix}/etc/php \
 --without-pear --enable-fastcgi \
(中略)
&& make && make test
lighttpd-php{44,50,51}.conf

ドキュメントルートは共通で、ポート番号とログ・ソケット・PID のパスを変える。

% cat ~/Applications/lighttpd/etc/lighttpd-php51.conf
(抜粋)
server.document-root = "/Users/rsky/Sites/lighty/"
server.errorlog = "/Users/rsky/Applications/lighttpd/log/lighttpd-php51.error.log"
accesslog.filename = "/Users/rsky/Applications/lighttpd/log/access-php51.log"
server.port = 8051
server.pid-file = "/private/tmp/lighttpd-php51.pid"
fastcgi.server = (".php" =>
                    ( "localhost" =>
                      (
                        "socket" => "/private/tmp/php51-fastcgi.socket",
                        "bin-path" => "/Users/rsky/Applications/php51-fcgi/bin/php"
                      )
                    )
                  )
lighttpdctl

lighhtpd の起動・終了には超適当なシェルスクリプト lighttpdctl を使う。

% cat lighttpdctl
#!/bin/sh

LIGHTTPD_BASE="${HOME}/Applications/lighttpd"
LIGHTTPD_BIN="${LIGHTTPD_BASE}/sbin/lighttpd"

LIGHTTPD_CONF44="${LIGHTTPD_BASE}/etc/lighttpd-php44.conf"
LIGHTTPD_CONF50="${LIGHTTPD_BASE}/etc/lighttpd-php50.conf"
LIGHTTPD_CONF51="${LIGHTTPD_BASE}/etc/lighttpd-php51.conf"

LIGHTTPD_PORT44="8044"
LIGHTTPD_PORT50="8050"
LIGHTTPD_PORT51="8051"

LIGHTTPD_PID44="/private/tmp/lighttpd-php44.pid"
LIGHTTPD_PID50="/private/tmp/lighttpd-php50.pid"
LIGHTTPD_PID51="/private/tmp/lighttpd-php51.pid"
LIGHTTPD_CHK="/private/tmp/lighttpd.running"

case "$1" in
  start)
    if [ -e ${LIGHTTPD_CHK} ]
    then
      echo "lighttpd already running."
      exit 1
    else
      echo "starting lighttpd..."
      ${LIGHTTPD_BIN} -f ${LIGHTTPD_CONF44} && echo "lighttpd + php-4.4 uses port #${LIGHTTPD_PORT44}"
      ${LIGHTTPD_BIN} -f ${LIGHTTPD_CONF50} && echo "lighttpd + php-5.0 uses port #${LIGHTTPD_PORT50}"
      ${LIGHTTPD_BIN} -f ${LIGHTTPD_CONF51} && echo "lighttpd + php-5.1 uses port #${LIGHTTPD_PORT51}"
      touch ${LIGHTTPD_CHK}
    fi
    ;;
  stop)
    if [ -e ${LIGHTTPD_CHK} ]
    then
      echo "stopping lighttpd..."
      kill `cat ${LIGHTTPD_PID44} ${LIGHTTPD_PID50} ${LIGHTTPD_PID51}`
      rm ${LIGHTTPD_CHK}
    else
      echo "lighttpd not running."
      exit 1
    fi
    ;;
  restart)
    if [ -e ${LIGHTTPD_PID} ]
    then
      echo "stopping lighttpd..."
      kill `cat ${LIGHTTPD_PID44} ${LIGHTTPD_PID50} ${LIGHTTPD_PID51}`
      sleep 1
    fi
    echo "starting lighttpd..."
    ${LIGHTTPD_BIN} -f ${LIGHTTPD_CONF44} && echo "lighttpd + php-4.4 uses port #${LIGHTTPD_PORT44}"
    ${LIGHTTPD_BIN} -f ${LIGHTTPD_CONF50} && echo "lighttpd + php-5.0 uses port #${LIGHTTPD_PORT50}"
    ${LIGHTTPD_BIN} -f ${LIGHTTPD_CONF51} && echo "lighttpd + php-5.1 uses port #${LIGHTTPD_PORT51}"
    touch ${LIGHTTPD_CHK}
    ;;
  *)
    echo "Usage: $0 start|strop|restart"
    ;;
esac