2010-10-31

phpfarmを使って複数バージョンのPHPをインストール

先日 LL を複数入れる話をまとめて、なんで PHP にないんだよという話を書いたらツッコミをいただきました。その名も phpfarm なんと本家にありました^^;

使い方

必要なものは

  • フツーにコンパイルできる環境
  • Subversion
  • bash

です。以下のように使います。

$ svn co http://svn.php.net/repository/pear/ci/phpfarm/trunk/ phpfarm
$ cd phpfarm/src
$ ./compile.sh 入れたいバージョン

なんて簡単。

やってくれること

  1. source の取得、展開、コンパイル
  2. コンパイルオプションを設定する方法
    • 基本は options.sh で、バージョン毎に cutstom-options-{version}.sh を用意すればよい
  3. 指定のディレクトリへの CLI SAPI バイナリへの link の集約
  4. カスタム php.ini を準備する方法
    • 基本は custom-php.php で、同様に custom-php-{version}.ini を用意

やってくれないこと

rvm と違ってできないことがたくさんあります。

  1. インストール可能なバージョンの確認
  2. インストール済みバイナリを切り替えて指定のバージョンを起動する
  3. httpd.conf 周り

特に 3 が面倒になるかなぁという感じですね。

一応 CLI バイナリは一カ所に集まっているので SAPI によらず動かせるコードを書くようにしていれば、複数バージョンでのテストなどもなんとか動かせそうに思います。

Apache の mod_php については 複数の mod_php を LoadModule するのはできないような気がするので、仮想マシンを PHP の数だけ立てるような感じにするか、いちいち httpd.conf を書き換えて Apache を再起動する切り替えツールを自前で書くしかないんじゃないでしょうか。他の LL に比べるとだいぶ面倒な感じになりますね。

※ ちなみに自分が以前 PHP 4 から 5 への移行を行った際は複数のサーバを立てて NFS でコードを共有して1 テストしました。その都度再起動しないのであれば OS 丸ごと増やすのが楽なのかなと思います。

入れ終わった様子

phpfarm ROOT
|-- inst
|   |-- bin
|   |   |-- php-4.4.9        -> ../inst/php-4.4.9/bin/php
|   |   |-- php-5.3.3        -> ../inst/php-5.3.3/bin/php
|   |   |-- php-cgi-5.3.3    -> ../inst/php-5.3.3/bin/php-cgi
|   |   |-- php-config-5.3.3 -> ../inst/php-5.3.3/bin/php-config
|   |   |-- phpize-5.3.3     -> ../inst/php-5.3.3/bin/phpize
|   |   `-- pyrus-5.3.3      -> ../inst/php-5.3.3/bin/pyrus
|   |-- php-4.4.9
|   |   |-- bin
|   |   |-- include
|   |   |-- lib
|   |   `-- man
|   `-- php-5.3.3
|       |-- bin
|       |-- include
|       |-- lib
|       |-- man
|       `-- pear
`-- src
    |-- bzips
    |-- php-4.4.9
    `-- php-5.3.3

これで、phpfarm の inst/bin に PATH が通っていれば一応複数バージョンを使い分けることができる道理です。

pear, pecl 周り

pear ついては make で入れる方法が提供されるような雰囲気のファイルが src/php-{version}/pear 以下にあるのですが、Makefile がないので機能しません。手で適当に go-pear で入れるのが正解のようです。

試しに上の状態で 4.4.9 用と 5.3.3 用に pear を入れてみましたが、4.4.9 は pear list を出すだけでなんかすごい量のエラーのような警告のようなメッセージが出て、5.3.3 は go-pear でのインストールの段階で大量の deprecated の警告が出ます。

なんというか、pear, pecl までこなれていないうえに、PHP の過渡期っぷりを感じてしまいます。5.1, 5.2 辺りでお茶を濁すならわざわざ自分でコンパイルしなくても各種ディストリビューションのバイナリパッケージ使った方が簡単ですしねぇ。うーん、どうしたものやら。

まとめ

クセがつかめれば、できることは制限されますが OS 丸ごと増やすよりはまだ楽かもしれません。とは言え今ある phpfarm の sh script だけだと不便なのは間違いないので、自分用のツールを書き足す工夫は必要かと思います。

自分の場合はやっぱり Ruby で phpfarm wrapper 作るべきなんでしょうかねぇ。

  1. キャッシュやセッションなどはもちろん共有しない 

About

例によって個人のなんちゃらです