複数の 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 [...]


使用可能なタグ <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>