Hatena::ブログ(Diary)

hnwの日記 このページをアンテナに追加 RSSフィード

[プロフィール]
 | 

2012年8月28日(火) 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 git@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なども各バージョンのものに切り替わります。


参考URL

大半の内容は@yuya_takeyamaさんの記事を読めばわかります。


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

 | 
ページビュー
1841944