(2013-03-25追記)下記PHPのビルドにはgcc、autoconf、automake、libtool、bison、re2c、libmcrypt、jpeg、libpng、flex(PHP 5.2.17のみ)などのインストールが必要です。
PHPのバージョンを色々揃えたいというニーズは多くの人がお持ちだと思います。これを解決する方法の一つにphp-buildがあります。このツールとphpenvを組み合わせて使うことで、様々なバージョンのPHPを楽に扱うことができます。
これら2つのツールについては既に他の方も紹介されていますが、両ツールの最新バージョンに追随したい場合など、少々わかりにくい点がある気がします。また、インストール方法も何種類か流儀があり、どうするのがベストか悩んでいる人もいるのではないでしょうか。
本稿ではphpenv+php-buildを僕がどう使っているかを紹介します。構築・運用の一例として参考になれば幸いです。
phpenvとphp-build
php-buildは複数のPHP環境を構築するためのツールです。phpenvと併用することで、phpとタイプしたときに呼び出されるPHPのバージョンを自由に切り替えることができます。同様のツールとしてはRubyのrvmが有名ですね。
僕自身、近い目的でphpallというツールを作っているのですが、phpenv+php-buildは次のような優位性を持っています。
- phpizeコマンドなどを含めPHPのバージョンを切り替えられる
- Extensionの開発時に非常に便利!
- PEARやExtensionのディレクトリについてPHPのバージョンごとに別で持っている
- APCやXdebugなど、実戦に即したExtensionをビルドしてくれる
3つめの項目はメリットもデメリットもある話題のように思います。というのも、phpallではビルドするExtensionをかなり絞っているため、比較的多くの環境でPHP5.0系から全バージョンをビルドできる傾向があります。一方で、php-buildはよく使われるExtensionの大多数をビルドしようとするのですが、その分だけ関連ライブラリを要求します。後述するように回避策もあるのですが、環境によっては少し敷居が高くなるかもしれません。
インストール
まずphpenvをインストールしましょう。インストールにはgitコマンドが必須です。
curl -L https://raw.github.com/CHH/phpenv/master/bin/phpenv-install.sh | bash
上記コマンドの終了時のメッセージに従い、.bashrcまたは.zshrcの末尾に次の2行を追加してシェルを再起動します。
PATH=$HOME/.phpenv/bin:$PATH # Add phpenv to PATH for scripting eval "$(phpenv init -)"
次に、php-buildをphpenvのプラグインとしてインストールします。下記のようにすることで、「phpenv install」コマンドが有効になります。これはruby-buildをrbenvのプラグインとして使うやり方を真似たものです。
mkdir $HOME/.phpenv/plugins cd $HOME/.phpenv/plugins git clone https://github.com/php-build/php-build.git
以下の2行は僕の出しているPull Request「add rbenv-install for working as plugin to CHH's phpenv」が通ったら不要になるんですが、いまのところ放置されています。
(2013-06-19追記)以下の2行はphp-build最新版(0.10.0)以降は不要になりました。
curl https://raw.github.com/hnw/php-build/plugin-to-chh-phpenv/bin/rbenv-install > php-build/bin/rbenv-install chmod a+x php-build/bin/rbenv-install
PHPのビルド
では早速PHPの各バージョンをビルドしてみましょう。「phpenv install --complete」とタイプするとインストール可能な全バージョンが表示されます。zshを利用している場合は、「phpenv install 」の後でtabキーを押すと候補が出てきます。
5.2.17 (略) 5.3.16 (略) 5.3snapshot (略) 5.4.6 5.4snapshot
かなり膨大な量が出てきますが、大半は不要なものだと思います。とはいえ、snapshotもビルドできるのは素晴らしいですね。今回は5.2.17, 5.3.16, 5.4.6の3バージョンをビルドしてみましょう。
phpenv install 5.2.17 phpenv install 5.3.16 phpenv install 5.4.6
ビルドオプションを変更する
ビルドの際、コンパイラに渡すオプションを変更することもできます。たとえば-gつきでコンパイルしたい場合は次のようになります。
CFLAGS="-g" phpenv install 5.2.17 CFLAGS="-g" phpenv install 5.3.16 CFLAGS="-g" phpenv install 5.4.6
こうしておくとgdbでPHPの処理を追いかけたい場合に便利です*1
また、configureのオプションを変更することもできます。configureオプションはPHP 5.2.17を例に挙げれば下記のパスに記述してあります。
$HOME/.phpenv/plugins/php-build/share/php-build/definitions/5.2.17
僕の環境ではPHP 5.2.17でmysqliを有効にするとなぜかリンクが通らなかったので、mysqliに関する行を次のように修正して使っています。
configure_option -D "--with-mysqli"
この-Dというのはデフォルトで指定されているconfigureオプションを除去するという意味です。また、-Rであれば指定されているconfigureオプションの値を変更する指定になります。
ちなみにデフォルトのconfigureオプションは下記のパスに記述してあります。
$HOME/.phpenv/plugins/php-build/share/php-build/default_configure_options
これとバージョン毎の指定をマージしたものが各バージョンのconfigureオプションになるわけです。
phpenvのバージョンアップに追随する
phpenvのドキュメントに従えば、バージョンアップは次のように行えます。
curl https://raw.github.com/CHH/phpenv/master/bin/phpenv-install.sh | UPDATE=yes bash
ただし、これは今のところ$HOME/.phpenv以下でgit pull origin masterするだけです。これだと内部的に利用しているrbenvのバージョンアップにしか追随できないので、phpenv自体のバグが見つかったような場合は改めて新規インストールしてしまうのも手です。
php-buildのバージョンアップに追随する
僕のやり方だと、php-buildのバージョンアップにもgitコマンドを利用します。最新版に追随する場合は次のようになります。
cd $HOME/.phpenv/plugins/php-build/ git pull
また、特定のバージョンにしておきたい場合は次のようにもできます。
cd $HOME/.phpenv/plugins/php-build/ git fetch git checkout v0.8.0
使い方
下記のようにしてバージョンを切り替えて使います。
phpenv global 5.2.17 # php-buildで作った5.2.17環境になる phpenv global system # 通常のPATH内で見つかるPHP環境になる
上記コマンドでバージョンを切り替えると、phpコマンドだけでなくphpizeやpyrusなども各バージョンのものに切り替わります。
参考URL
大半の内容は@yuya_takeyamaさんの記事を読めばわかります。