phpbrew note

ローカル開発環境に phpenv + php-build を使っていたが、phpbrew のほうが簡単そうだったので移行した。

environment

  • osx 10.9.5
  • Apache/2.2.29
  • mysql 5.6.15

メリット

  • apache の php モジュールをバージョン毎に保存してくれる。
  • configure オプションのコンパイルが楽になる(特にosx)
    • pcre
    • –enable-intl
      など。

デメリット

  • 使用するのに php5.3 以上が必要
  • configure option を variants という独自の仕組みで指定する。
  • php のバージョン切り替えで挙動が不安定な時がある

Requirement

https://github.com/phpbrew/phpbrew/wiki/Requirement

phpbrew を利用するには php が必要。
osx はデフォルトで php がインストールされているので、osx ユーザーにはいいと思う。

インストール

$ curl -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew
$ chmod +x phpbrew
$ mv phpbrew /usr/local/bin/

configure option の設定と php のインストール

phpbrew には variants という独自の configure option の指定方法がある。

$ phpbrew install 5.3.10 +pdo +mysql +pgsql +apxs2=/usr/bin/apxs2

variants の一覧は以下のコマンドで確認可能。

$ phpbrew variants

variants を使うと、configure オプションによるビルドの失敗を上手く補ってくれるメリットがある。
例えば、pcre オプションは以下の様な失敗をしやすい。

  • php の cli で動く pcre と apache モジュールで動く pcre のバージョンが違う
  • apache に同梱された pcre がリンクされて、そのバージョンが古くてまともに動かない
  • pcre ライブラリを指定しても、正しくリンクされない(個人的には osx でありました)

結果として、preg_replace 等、preg 系関数がまともに動かなくなってしまうことがある。

しかし、この variants を使って pcre を指定すれば、apache モジュールと php cli で同じバージョンのちゃんと動く pcre ライブラリが入る。
これはかなりありがたい。

--enable-intl もlinux に比べて osx では php のビルドがまともにいかないことが多いが、それもうまく補ってくれる。

ちなみに、-- に続けて書けば通常の configure option の記述も可能。

$ phpbrew install 5.3.10 +mysql +sqlite -- \
    --enable-ftp --apxs2=/opt/local/apache2/bin/apxs

ファイルによる variants の設定

yamlファイルで独自の variants を設定できる。

https://github.com/phpbrew/phpbrew/wiki/Setting-up-Configuration

config.yaml

variants:
  dev:
    bcmath:
    mbstring:
    intl:
    icu:
      - --with-icu-dir=/usr/local/opt/icu4c
    gettext:
      - --with-gettext=/usr/local/opt/gettext
    pcre:
    readline:
    xml:
      - --with-libxml-dir=/usr/local/opt/libxml2
    soap:
    zlib:
      - --with-zlib=/usr/local/opt/zlib
      - --with-zlib-dir=/usr/local/opt/zlib
    gd:
      - --with-gd
      - --with-jpeg-dir=/usr/local/opt/jpeg
      - --with-png-dir=/usr/local/opt/libpng
      - --with-freetype-dir=/usr/local/opt/freetype
      - --enable-gd-native-ttf
      - --enable-gd-jis-conv
    openssl:
    mcrypt:
    curl:
    mysql:
    pdo:
    my-exif:
      - --enable-exif
    my-config-file-path:
      - --with-config-file-path=/Users/yutaf/Sync/www/php.ini
extensions:
  dev:
    xdebug: stable

yamlファイルを作成後、以下のコマンドを実行する。

$ phpbrew init -c=/path/to/config.yaml

ファイルに記述されている +dev variants を使用できるようになる。

$ phpbrew -d install 5.4.36 +dev

個人的ベストプラクティス

$ phpbrew -d install 5.4.36 +neutral +apxs2=/opt/apache2.2.29/bin/apxs +dev

+neutral を指定しないと --disable-all 等のオプションが自動的に設定される。
--disable-all は phpのデフォルトで有効な json や xml モジュール等が無効になるので、これらの関数が使用できなくなる。

'+apxs2' は apache の php モジュールをバージョン毎に管理する為に必須(後述)。

extension のインストール

xdebug などの extension も yaml ファイル に独自の variants を記述してインストールできる。
(上のyaml を参照。)

$ phpbrew ext install +dev

php のバージョン切り替え

$ phpbrew switch php-5.4.36

apache のphpモジュール切り替え

variants の +apxs2 を設定すると各バージョンごとにモジュールを保存し、 httpd.conf に LoadModule php5_module ... の記述がされる。

https://github.com/phpbrew/phpbrew/wiki/Cookbook#apache2-support

ただし、その際 conf と modules フォルダのパーミッションを 777 に変更するよう言われる。

$ phpbrew install 5.3.29 +apxs2=/opt/apache2.2.29/bin/apxs
$ phpbrew install 5.4.36 +apxs2=/opt/apache2.2.29/bin/apxs
  • 作成されるモジュール
/opt/apache2.2.29/modules/libphp5.3.29.so
/opt/apache2.2.29/modules/libphp5.4.36.so

  • httpd.conf
...

LoadModule rewrite_module modules/mod_rewrite.so
LoadModule php5_module        modules/libphp5.4.36.so
LoadModule php5_module        modules/libphp5.3.29.so

...

バージョンを切り替えるには httpd.conf で使用するバージョンのモジュール以外をコメントアウトして apache を再起動する

...

LoadModule rewrite_module modules/mod_rewrite.so
LoadModule php5_module        modules/libphp5.4.36.so
#LoadModule php5_module        modules/libphp5.3.29.so

...
$ sudo apachectl graceful

感想

気持ち悪い所も多いが、osx でphpをビルドするならこれが一番楽な気がした。