hnwの日記

phpenv+php-build環境の構築と運用

(2013-03-25追記)下記PHPのビルドにはgcc、autoconf、automake、libtool、bison、re2c、libmcrypt、jpeg、libpng、flexPHP 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のバージョンごとに別で持っている
  • APCXdebugなど、実戦に即した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

こうしておくとgdbPHPの処理を追いかけたい場合に便利です*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なども各バージョンのものに切り替わります。

*1:実際にgdbで利用する場合は、php-buildの中でmake cleanされるのをコメントアウトする必要があります。