複数の PHP をインストールし、切り替えて使う方法
lighttpd 1.4.7 を Mac OS X 10.4.3 にインストール や PHP 5.1.0RC5 Release で書いたように、メインマシンである PowerBook では PHP や ruby、lighttpd といったソフトは複数バージョンを共存できるよう configure に prefix を指定してインストールしています。
従って、例えば PowerBook の /usr/local/php は以下のようになっています。
$ ls -l /usr/local/php
total 8
lrwxr-xr-x 1 root wheel 27 11 18 03:38 current -> /usr/local/php/php-5.1.0rc5
drwxr-xr-x 7 root wheel 238 11 15 14:47 php-4.4.1
drwxr-xr-x 7 root wheel 238 11 15 18:06 php-5.0.5
drwxr-xr-x 7 root wheel 238 11 18 03:38 php-5.1.0rc5
さらに /usr/local/bin には以下のように php や pear コマンドへのリンクが貼ってあるので、
$ ls -l /usr/local/bin/p*
lrwxr-xr-x 1 root admin 31 11 15 17:50 /usr/local/bin/pear -> /usr/local/php/current/bin/pear
lrwxr-xr-x 1 root admin 34 11 12 01:05 /usr/local/bin/peardev -> /usr/local/php/current/bin/peardev
lrwxr-xr-x 1 root admin 31 11 12 01:05 /usr/local/bin/pecl -> /usr/local/php/current/bin/pecl
lrwxr-xr-x 1 root admin 32 11 12 01:14 /usr/local/bin/phing -> /usr/local/php/current/bin/phing
lrwxr-xr-x 1 root admin 30 11 15 14:54 /usr/local/bin/php -> /usr/local/php/current/bin/php
lrwxr-xr-x 1 root admin 37 11 15 14:54 /usr/local/bin/php-config -> /usr/local/php/current/bin/php-config
lrwxr-xr-x 1 root admin 33 11 15 14:54 /usr/local/bin/phpize -> /usr/local/php/current/bin/phpize
lrwxr-xr-x 1 root admin 34 11 12 01:15 /usr/local/bin/phpunit -> /usr/local/php/current/bin/phpunit
/usr/local/php/current のリンク先を切り替えることで、複数バージョンの PHP を使い分けることができています。~/.pearrc を削除しておけば、PEAR ライブラリもちゃんと各バージョン別に管理されるようです。
また、lighttpd + FastCGI + PHP(cgi-fcgi) という環境では lighttpd の設定ファイルで以下のように php コマンドのパスを指定するだけなので、current のリンク先を変えるだけでWebサーバで利用する PHP のバージョンも簡単に切り替えることができます。
fastcgi.server = ( ".php" =>
( "localhost" =>
(
"socket" => "/tmp/php-fastcgi.socket",
"bin-path" => "/usr/local/bin/php")))
current のリンク先切り替えは app_select という ruby スクリプトを作成して、以下のように行っています。
$ php -v
PHP 5.0.5 (cgi-fcgi) (built: Nov 15 2005 17:57:54)
Copyright (c) 1997-2004 The PHP Group
Zend Engine v2.0.5, Copyright (c) 1998-2004 Zend Technologies
$ app_select
Usage:
app_select [appname] [version]
$ app_select php
Current version: 5.0.5
Available version for php:
4.4.1
5.0.5
5.1.0rc5
$ sudo app_select php 4.4.1
Changed current version of php to 4.4.1
$ php -v
PHP 4.4.1 (cgi-fcgi) (built: Nov 15 2005 14:45:54)
Copyright (c) 1997-2004 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies
app_select はやっつけ仕事なのでかなりテキトーですが、以下のような内容になっています。
#!/usr/bin/env ruby
#
# usage:
# app_select [appname] => shows current version and available versions
# app_select [appname] [version] => changes current version
#
def usage
puts <<EOM
Usage:
app_select [appname] [version]
EOM
end
def current_version(app)
link = "/usr/local/#{app}/current"
if not FileTest.exist?(link)
puts 'Symbolic link #{link} is not exists'
else
File.basename(File.readlink(link)).gsub(/#{app}[^0-9]*/, '')
end
end
def display_available_version_for(app)
dir = "/usr/local/#{app}"
if FileTest.exist? dir
Dir.foreach(dir) {|e|
if e !~ /^(¥.|¥.¥.|current)$/ and FileTest.directory?(dir + '/' + e)
puts e.gsub(/#{app}[^0-9]*/, '')
end
}
else
puts "#{dir} is not exists"
end
end
def change_version(app, version)
current = "/usr/local/#{app}/current"
File.unlink(current) if FileTest.exist?(current)
old = "/usr/local/#{app}/#{app}-#{version}"
File.symlink(old, current)
end
# main here
if ARGV.size < 1
usage
exit
end
app = ARGV[0]
version = ARGV[1] || nil
if version.nil?
current = current_version(app)
puts "Current version: #{current}"
puts "Available version for #{app}:"
display_available_version_for(app)
else
change_version(app, version)
puts "Changed current version of #{app} to #{version}"
end
このスタイルはなかなか便利で気に入っているのですが、/usr/local/bin に current/bin/phing や current/bin/phpunit コマンドへのリンクを置いた状態で current を php4 などに切り替えると command not found になるのがちょっとダサいなあ、と思いつつあります。実害は無いのですが。あと、ruby などでは /usr/local/lib/ruby や /usr/local/lib/libruby.dylib なども current 以下を指すように準備しておく必要があるかも。

Sooey - PHP 5.1.0 Release, 11 月 28th, 2005 at 01:26 [Pingback]
[...] 私は PHP は独特の手法でインストールしていますので、それ用に php-fastcgi へのシンボリックリンクも作成。 [...]
sylvan › Mac OS X への Apache と PHP のインストール, 9 月 7th, 2007 at 15:09 [Pingback]
[...] 複数の PHP をインストールし、切り替えて使う方法 - Sooey This was written by sylvan. Posted on Tuesday, May 1, 2007, at 10:48 pm. Filed under [...]