わすれっぽいきみえ

みらいのじぶんにやさしくしてやる

phpenv + php-buildでphpのバージョン管理

追記 2014-05-20

どうもjosegonzalez/homebrew-phpは存在こそしているもののprivate repositoryになってしまったらしい。

$ brew tap josegonzalez/homebrew-php
Cloning into '/usr/local/Library/Taps/josegonzalez/homebrew-php'...
remote: Reusing existing pack: 6020, done.
remote: Total 6020 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (6020/6020), 1.17 MiB | 290.00 KiB/s, done.
Resolving deltas: 100% (3741/3741), done.
Checking connectivity... done.
Tapped 395 formula
It looks like you tapped a private repository. To avoid entering your
credentials each time you update, you can use git HTTP credential caching
or issue the following command:

  cd /usr/local/Library/Taps/josegonzalez/homebrew-php
  git remote set-url origin git@github.com:josegonzalez/homebrew-php.git

でもこのリポジトリの変更が組み込まれたはずのhomebrew/homebrew-phpにはphpenvおよびphp-buildが含まれていないらしく、josegonzalez/homebrew-phpbrew tapしておかないとError: No available formula for phpenvと表示されるようになってしまった。
根本的対策はまだ私もやってないから何とも言えないが、phpenv以外のバージョン管理ソフトの導入を考えた方がいいかもしれない。

結局MacならPHP 5.5/5.4/5.3 for OS X 10.6/10.7/10.8/10.9 as binary packageが便利なんだろうな…。
参考: macのphpをアップデート - わすれっぽいきみえ
他のlinux環境でphpのバージョン管理をしたいと思ったときのデファクトみたいなの、あるなら知りたい。

なおgithubに現在使っているbrewfileをあげている。

本編

rbenvを導入したのでphpenvを利用してphpのバージョン管理を行おうと思う。
で、今回はmacを利用するので、つい最近ホッテントリしてた

を参考にphpenvをbrew bundleでインストールしてみた。

まずbrew bundleする

次のように書いた。

tap homebrew/dupes || true
tap josegonzalez/homebrew-php || true
update || true
upgrade || true

install rbenv || true
install ruby-build || true
install --HEAD phpenv || true
install --HEAD php-build || true
install autoconf || true
install pkg-config || true
install openssl || true
install fontforge || true
install fontconfig || true
install freetype || true
install jpeg || true
install libtiff || true
install gettext || true
install libpng || true
install yasm || true

cleanup

の設定をする上で必要になったformulaもリスト化してある。

install --HEAD phpenvだったり、install --HEAD php-buildだったりするのはgithubのmasterブランチ最新バージョンをとってくるため。 デフォルトだと最新のタグをpullしてしまい、特にphp-buildは5.5.0betaまでしかphpをインストールできない。 なのでタグではなくHEADを取ってこいよと指定してやる必要がある。

あとは

$ brew bundle

でphpenvおよびphp-buildのダウンロード、インストールは完了。ただしrbenvの時と同じく.bashrcの設定が別途必要で

# phpenvの設定
export PATH="$HOME/.phpenv/bin:$PATH"
eval "$(phpenv init -)"

を追加しておいた。

実際にphp-buildでインストールしてみる

php-build --definitionsでインストール可能なphpのバージョンが選べる。
とりあえずphp5.4.25を入れてみよう。

$ php-build 5.4.25 ~/.phpenv/versions/5.4.25
[Info]: Loaded apc Plugin.
[Info]: Loaded pyrus Plugin.
[Info]: Loaded xdebug Plugin.
[Info]: Loaded xhprof Plugin.
[Info]: php.ini-production gets used as php.ini
[Info]: Building 5.4.25 into /Users/kimikimi714/.phpenv/versions/5.4.25
[Downloading]: http://php.net/distributions/php-5.4.25.tar.bz2
[Preparing]: /var/tmp/php-build/source/5.4.25
[Compiling]: /var/tmp/php-build/source/5.4.25
[Pyrus]: Downloading from http://pear2.php.net/pyrus.phar
[Pyrus]: Installing executable in /Users/kimikimi714/.phpenv/versions/5.4.25/bin/pyrus
[XDebug]: Downloading http://xdebug.org/files/xdebug-2.2.3.tgz
[XDebug]: Compiling in /var/tmp/php-build/source/xdebug-2.2.3
[XDebug]: Installing XDebug configuration in /Users/kimikimi714/.phpenv/versions/5.4.25/etc/conf.d/xdebug.ini
[XDebug]: Cleaning up.
[Info]: The Log File is not empty, but the Build did not fail. Maybe just warnings got logged. You can review the log in /tmp/php-build.5.4.25.20140305234416.log
[Success]: Built 5.4.25 successfully.
$ phpenv versions
* system (set by /Users/kimikimi714/.phpenv/version)
  5.4.25
$ phpenv global 5.4.25
$ phpenv rehash
$ phpenv versions
  system (set by /Users/kimikimi714/.phpenv/version)
* 5.4.25
$ php -v
    PHP 5.4.25 (cli) (built: Mar  5 2014 23:49:30)
    Copyright (c) 1997-2014 The PHP Group
    Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
      with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans

おお、入った。入った。
じゃあ今度は5.5.9

$ php-build 5.5.9 ~/.phpenv/versions/5.5.9
[Info]: Loaded apc Plugin.
[Info]: Loaded pyrus Plugin.
[Info]: Loaded xdebug Plugin.
[Info]: Loaded xhprof Plugin.
[Info]: php.ini-production gets used as php.ini
[Info]: Building 5.5.9 into /Users/kimikimi714/.phpenv/versions/5.5.9
[Downloading]: http://www.php.net/distributions/php-5.5.9.tar.bz2
[Preparing]: /var/tmp/php-build/source/5.5.9
[Compiling]: /var/tmp/php-build/source/5.5.9
[Pyrus]: Downloading from http://pear2.php.net/pyrus.phar
[Pyrus]: Installing executable in /Users/kimikimi714/.phpenv/versions/5.5.9/bin/pyrus
[XDebug]: Downloading http://xdebug.org/files/xdebug-2.2.3.tgz
[XDebug]: Compiling in /var/tmp/php-build/source/xdebug-2.2.3
[XDebug]: Installing XDebug configuration in /Users/kimikimi714/.phpenv/versions/5.5.9/etc/conf.d/xdebug.ini
[XDebug]: Cleaning up.
[Info]: Enabling Opcache...
[Info]: Done
[Info]: The Log File is not empty, but the Build did not fail. Maybe just warnings got logged. You can review the log in /tmp/php-build.5.5.9.20140306001329.log
[Success]: Built 5.5.9 successfully.
$ phpenv versions
  system
* 5.4.25 (set by /Users/kimikimi714/.phpenv/version)
  5.5.9
$ phpenv global 5.5.9
$ phpenv rehash
$ phpenv versions
  system
  5.4.25
* 5.5.9 (set by /Users/kimikimi714/.phpenv/version)
$ php -v
    PHP 5.5.9 (cli) (built: Mar  6 2014 00:21:47)
    Copyright (c) 1997-2014 The PHP Group
    Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
        with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies
        with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans

Yeah!

timezoneはちゃんと設定してあげないとだめです

$ php -r 'phpinfo();'
PHP Warning:  phpinfo(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in Command line code on line 1
PHP Stack trace:
PHP   1. {main}() Command line code:0
PHP   2. phpinfo() Command line code:1
phpinfo()
PHP Version => 5.5.9
(以下いろいろ設定)

というわけでtimezone設定されてないからちゃんと書いてね!とおこられるので、インストールの都度設定の必要がある。

$ php -r 'phpinfo();' | grep ini
…
Configuration File (php.ini) Path => /Users/kimikimi714/.phpenv/versions/5.5.9/etc
Loaded Configuration File => /Users/kimikimi714/.phpenv/versions/5.5.9/etc/php.ini
…

みたいな行が見つかるはずなので

$ vim /Users/kimikimi714/.phpenv/versions/5.5.9/etc/php.ini
…
    [Date]↲
    ; Defines the default timezone used by the date functions↲
    ; http://php.net/date.timezone↲
    date.timezone = Asia/Tokyo
…

の設定をしてあげてください。

番外編 もう一つのphpenv

phpenv.org by phpenvというのも実はあって*1、 これを使うとphp-buildがいらなくなる。

さらにtarファイルのダウンロード・展開ではなくgithubから直接ソースをpullしてきてビルドするというものなのだが、 エラーが解決しきれずに力つきて導入をあきらめた。(実際おとついの夜と昨晩はこれでつぶれて謎の夜更かしをしてしまった。)

興味がある人は一応この話もブログにしようかと思って下書きを書いてはいたので、続きを読むからお進みください。

元々はCHH/phpenv · GitHubだったものをまた別に書き直してphp-buildを入れずとも phpをインストールできるようにしたものになっている。多くの人が書いているブログ記事(ググったらかなりヒットする)のphpenvはhomebrewで入れるものだったり、CHHさんのリポジトリを参照していたりするのだけども、今回私が入れようとしたものはそれらとは異なることに注意していただきたい。

phpenv-installによると

  • use of the php-src repo to compile your individual PHP installs as opposed to downloading a tarball from php.net.
  • reads configuration options from source files located in .phpenv/etc
  • allows you to do multiple builds per release
  • includes building custom extensions located in the ".phpenv/php-ext` folder, as per the configuration source files, both static or shared.
  • allows you to continue a failed installation from anywhere
  • and more...

php-buildに依存せず、直接php.netが管理しているgithubのソースを見に行くことでphpのインストールを可能にしている。

とりあえずclone用ディレクトリにgit cloneしてきてシンボリックリンク貼ったった。

$ git clone git@github.com:phpenv/phpenv.git
$ ln -s ~/Documents/git_clone/phpenv ~/.phpenv

これで、.bashrcに次の行を書いておく。

# phpenvの設定
export PATH="$HOME/.phpenv/bin:$PATH"
eval "$(phpenv init -)"

これで新しい窓開いたらphpenvがもう使える。
まだ何もほかにインストールしてない状態でphpenv versionsをうつと何も表示されないが、一応

$ phpenv version
system (set by /Users/user/.phpenv/version)

とはなってくれる。

次に実際にphpenvを使ってインストールできるものを見てみる。それらを見るには

$ phpenv install --releases
    [Cloning]:  source from php-src Github repo
    [Fetching]:  latest code from Github repo
    (なんかほかにもいっぱーーーーい)
php-5.5.1
php-5.5.10RC1
php-5.5.2
php-5.5.2RC1
php-5.5.3
php-5.5.4
php-5.5.4RC1
php-5.5.5
php-5.5.5RC1
php-5.5.6
php-5.5.6RC1
php-5.5.7
php-5.5.7RC1
php-5.5.8
php-5.5.8RC1
php-5.5.9
php-5.5.9RC1
php-5.6.0alpha1
php-5.6.0alpha2
php-5.6.0alpha3

みたいな感じでgithubから直接引っ張って来れるリストが見れる。
とりあえずphp5.5環境とphp5.4環境を入れてみよう

$ phpenv install php-5.5
php.ini-development gets used as php.ini

Building php-5.5

    [Error]:  Release php-5.5 not found.

BUILD ERROR


The full Log is available here /tmp/phpenv-install-php-5.5.20140304013404.log

む、5.5.*みたいなのには対応してないのか。仕方ない。

$ phpenv install php-5.5.9
php.ini-development gets used as php.ini

Building php-5.5.9

    [Fetching]:  latest code from Github repo
    [Branching]:  for a clean build environment
    [Configuring]:  build options for selected release

BUILD ERROR
Switched to a new branch 'build'
uname: illegal option -- o
usage: uname [-amnprsv]
configure: WARNING: bison versions supported for regeneration of the Zend/PHP parsers: 2.4 2.4.1 2.4.2 2.4.3 2.5 2.5.1 2.6 2.6.1 2.6.2 2.6.3 2.6.4 2.6.5 2.7 (found: 2.3).
configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
configure: error: bison is required to build PHP/Zend when building a GIT checkout!
Switched to branch 'master'

The full Log is available here /tmp/phpenv-install-php-5.5.9.20140304013510.log

おや、まだエラー。

$ bison --version
bison (GNU Bison) 2.3
Written by Robert Corbett and Richard Stallman.

Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

ふむ。bisonが古いとな。
じゃあbison2.7入れますか。(参考: homebrew で標準のバージョンよりも古い bison をインストールする - Sarabande.jpInstall specific version of Homebrew formulaphpenvでphp5.5.7とかビルドするとbisonとかでおこなので、brewでどうにかするつもりが結局bison27のFormulaかく羽目になったやつ - uzullaがブログ)

$ brew search bison
bison
homebrew/versions/bison27
$ cd `brew --prefix`
$ git lg -10 Library/Formula/bison.rb # lgは私が貼ったgit logのエイリアス
  * 3872723 2013-12-11 Jack Nagel  bison 3.0.2
  * 4715b3c 2013-11-13 Jack Nagel  bison 3.0.1
  * b744b43 2013-07-26 Adam Vandenberg  bison 3.0
  * 804bcf6 2013-04-16 Jack Nagel  bison 2.7.1
  * adf87c6 2013-02-02 Adam Vandenberg  bison 2.7
$ git checkout adf87c6 /usr/local/Library/Formula/bison.rb
$ brew install bison
$ /usr/local/Cellar/bison/2.7/bin/bison --version
  bison (GNU Bison) 2.7
  Written by Robert Corbett and Richard Stallman.

  Copyright (C) 2012 Free Software Foundation, Inc.
  This is free software; see the source for copying conditions.  There is NO
  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ brew link bison --force # これで/usr/local/bin下にbisonのシンボリックリンクができる
$ vim .bashrc
  # homebrewでインストールしたものが/usr/binより先に読み込まれるようにするための設定↲
  export PATH="/usr/local/bin:$PATH"
(新しいセッションを開いて)
$ bison --version
  bison (GNU Bison) 2.7
  Written by Robert Corbett and Richard Stallman.

  Copyright (C) 2012 Free Software Foundation, Inc.
  This is free software; see the source for copying conditions.  There is NO
  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

うむ、入った。でもre2c入ってないので、

$ brew install re2c
  ==> Downloading https://downloads.sourceforge.net/project/re2c/re2c/0.13.6/re2c-0.13.6.tar.gz
  ######################################################################## 100.0%
  ==> ./configure --prefix=/usr/local/Cellar/re2c/0.13.6
  ==> make install
  🍺  /usr/local/Cellar/re2c/0.13.6: 5 files, 344K, built in 26 seconds

よし、もっぺんphp 5.5.9インストールしてみようか。

$ phpenv install php-5.5.9
php.ini-development gets used as php.ini

Building php-5.5.9

    [Fetching]:  latest code from Github repo
    [Branching]:  for a clean build environment
    [Configuring]:  build options for selected release

BUILD ERROR
Switched to a new branch 'build' uname: illegal option -- o usage: uname [-amnprsv] configure: error: mcrypt.h not found. Please reinstall libmcrypt.

The full Log is available here /tmp/phpenv-install-php-5.5.9.20140305000121.log

おーいw 初めからlibmcryptないって言ってよ。

$ brew install libmcrypt
  ==> Downloading https://downloads.sourceforge.net/project/mcrypt/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz
  ######################################################################## 100.0%
  ==> ./configure --prefix=/usr/local/Cellar/mcrypt/2.5.8 --mandir=/usr/local/Cellar/mcrypt/2.5.8/share/man
  ==> make install
  🍺  /usr/local/Cellar/mcrypt/2.5.8: 12 files, 332K, built in 34 seconds

よしもっかい!!

$ phpenv install php-5.5.9 --deep-clean
php.ini-development gets used as php.ini

Building php-5.5.9

    [Fetching]:  latest code from Github repo
    [Branching]:  for a clean build environment
    [Configuring]:  build options for selected release

BUILD ERROR
Switched to a new branch 'build' uname: illegal option -- o usage: uname [-amnprsv] configure: error: invalid readline installation detected. Try --with-libedit instead.

The full Log is available here /tmp/phpenv-install-php-5.5.9.20140305001111.log

ん?あ、unameのエラー出てたのに見てなかった。てかillegal optionってamnprsvからしか選べないのですが。 と思って調べたら(参考: On OS X: uname: illegal option -- o · Issue #25 · perl11/potion · GitHubsを使えばいいとのこと。
これphpenvのスクリプト自体を修正しないといけないじゃん…。

と思ってphpenv-install.shスクリプト見に行ったら、オプションにoなんか使ってないんだが?は?一番最初に開いてるブランチがdev?masterではo使ってる…。マジかよ…。

もういいdevブランチに切り替えましょう。

$ phpenv install php-5.5.9
phpenv v0.0.4-dev

/Users/kimikimi714/.phpenv/php-src/php.ini-recommended gets used as php.ini
Building 5.5.9 with config options from: php-5.5.Darwin.source

                         [Fetching] |1| latest code from Github repo
                        [Branching] |2| for a clean build environment
                         [Patching] |3| Applying patches to the source if any are applicable.
                      [Configuring] |4| build options for selected release

BUILD ERROR: STATUS is 4
The script aborted unexpectedly when a command returned a non zero exit code.
Last 10 linens from the error log file may shed some light
-------------------------------------------------------------------------------------
Switched to a new branch 'build'
configure: WARNING: unrecognized options: --enable-apc, --enable-apc-debug, --enable-apc-filehits, --enable-igbinary, --enable-memcached, --with-libmemcached-dir, --enable-memcached-igbinary, --with-http-curl-requests, --with-http-curl-libevent, --with-http-zlib-compression, --with-http-magic-mime
configure: error: Could not find pcre.h in /usr/local/opt/pcre

-------------------------------------------------------------------------------------

The full STDERR Log is available here /tmp/phpenv-install-php-5.5.9.20140305004753.log.err
The full STDOUT Log is available here /tmp/phpenv-install-php-5.5.9.20140305004753.log
The command to view the logfile with $PAGER has been copied to your clipboard.

~/.phpenv/libexec

マジか…。こっちの方がずいぶん詳細ですね。でもビルド失敗です。

$ brew install pcre
  ==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/pcre-8.34.mavericks.bottle.tar.gz
  ######################################################################## 100.0%
  ==> Pouring pcre-8.34.mavericks.bottle.tar.gz
  🍺  /usr/local/Cellar/pcre/8.34: 146 files, 5.6M

もーいっかい!もーいっかい!

$ phpenv install php-5.5.9
  phpenv v0.0.4-dev

  /Users/kimikimi714/.phpenv/php-src/php.ini-recommended gets used as php.ini
  Building 5.5.9 with config options from: php-5.5.Darwin.source

  The version 5.5.9 was previously installed.
  Would you like to remove the current installation and re-install? Y/n: Y

                           [Fetching] |1| latest code from Github repo
                          [Branching] |2| for a clean build environment
                           [Patching] |3| Applying patches to the source if any are applicable.
                        [Configuring] |4| build options for selected release

  BUILD ERROR: STATUS is 4
  The script aborted unexpectedly when a command returned a non zero exit code.
  Last 10 linens from the error log file may shed some light
  -------------------------------------------------------------------------------------
  Switched to branch 'master'
  Switched to a new branch 'build'
  configure: WARNING: unrecognized options: --enable-apc, --enable-apc-debug, --enable-apc-filehits, --enable-igbinary, --enable- memcached, --with-libmemcached-dir, --enable-memcached-igbinary, --with-http-curl-requests, --with-http-curl-libevent, --with- http-zlib-compression, --with-http-magic-mime  
  configure: error: vpx_codec.h not found.  

  -------------------------------------------------------------------------------------

  The full STDERR Log is available here /tmp/phpenv-install-php-5.5.9.20140305005444.log.err
  The full STDOUT Log is available here /tmp/phpenv-install-php-5.5.9.20140305005444.log
  The command to view the logfile with $PAGER has been copied to your clipboard.

  ~/.phpenv/libexec

今度はvpx_codec.hがないとな。(参考: [homebrew] libvpx build log

$ brew search vpx_codec
  No formula found for "vpx_codec".
  Searching pull requests...
$ brew search libvpx
  libvpx
$ brew install libvpx
  ==> Installing libvpx dependency: yasm
  ==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/yasm-1.2.0.mavericks.bottle.tar.gz
  ######################################################################## 100.0%
  ==> Pouring yasm-1.2.0.mavericks.bottle.tar.gz
  🍺  /usr/local/Cellar/yasm/1.2.0: 44 files, 3.3M
  ==> Installing libvpx
  ==> Downloading http://webm.googlecode.com/files/libvpx-v1.3.0.tar.bz2
  ######################################################################## 100.0%
  ==> ../configure --prefix=/usr/local/Cellar/libvpx/1.3.0 --enable-pic --disable-examples --disable-runtime-cpu-detect --  target=x86_64-darwin13-gcc  
  ==> make install
  🍺  /usr/local/Cellar/libvpx/1.3.0: 16 files, 2.0M, built in 61 seconds
$ phpenv install --deep-clean
$ phpenv install --releases

ついでにdevブランチになった上でもっかいinstall環境をきれいきれいしたった。これでどうや。

とかいろいろやったけど、もう疲れたよ…パトラッシュ。

*1:ページが開発中なのはわかるが、とても残念な感じだ…。