鱒身(Masu_mi)のブログ

知った事をメモする場所。

PHP開発環境を整備した(phpenv)

  • バージョン・ライブラリ依存を管理したい
  • 実装・デバグ・リファクタのツール類が整っている

PHPでの実装

PHP関係で調べてみたら以下の組み合わせで出来そう。 (エディタ周辺は色々ありそうで除外)

静的チェック php -l
動的チェック xdebug
バージョン管理 phpenv
pkgインストーラ pyrus
プロファイラ xprof
ビルドツール Phing
テストFW PHPUnit

phpenv導入

osxで phpenv を中心に環境を整えた。 httpdhomebrew でインストールしている前提なので他OSだと連携部分が変わると思う。

phpenv でPHPをインストールするとpyrusが自動的に使える。 PHPUnit, xdebug, xprof, phing かは pyrus 経由で導入する(実際は失敗した)。

[準備]PHPビルドに必要なpkgのインストール

他にも必要かも知れないけれど下ので大丈夫だった。 PHPビルド時に怒られたら都度追加する。

# for building php
brew install re2c
brew install libmcrypt

[準備]Apache:httpd インストール

apache::httpd をbrew経由で入れる。 そしてphpを使う様にconfigファイルを書き換える。

ここでは SERVER_CONFIG_FILE を直接書き換えてるけど、 無作法なので ./others, ./conf.d とかに別ファイルで書いて読み込む。

# php is used with apache httpd often.
brew tap Homebrew/dupes
brew install httpd

# libphp5.soを有効にする
httpd_conf_path=$(httpd -V | awk 'BEGIN{FS="\""} /SERVER_CONFIG_FILE/{print $2}')
sed -i -e "s/#LoadModule php5_module/LoadModule php5_module/" $httpd_conf_path

phpenvをインストール

以下の実行後に .bashrcenv 系おなじみの修正を加える。

# install phpenv, dependencies and plugin
curl https://raw.github.com/CHH/phpenv/master/bin/phpenv-install.sh | sh

git clone https://github.com/CHH/php-build/ ${HOME}/.phpenv/plugins/php-build
cp ~/.phpenv/plugins/php-build/bin/phpenv-install ~/.phpenv/plugins/php-build/bin/rbenv-install
sed -i -e "s/# Provide phpenv completions/# Provide rbenv completions/g" ~/.phpenv/plugins/php-build/bin/rbenv-install
phpenv rehash

加える内容は以下になる。自分はdotfile再読み込みでPATHが冗長になるのを避ける為に関数を挟んでる。

export PATH=${HOME}/.phpenv/bin:${PATH}
eval "$(phpenv init -)"

apache::httpdと連携する為に共用ビルドオプションを設定する

phpenv 経由でビルドする際のビルドオプションは .phpenv/plugin/php-build/share/php-build/default_configure_options に記述する。 なので以下を実行するとモジュールが作られる様になる。

# add --with-apxs2=/usr/sbin/apxs
echo "--with-apxs2=/usr/sbin/apxs" >> ${HOME}/.phpenv/plugins/php-build/share/php-build/default_configure_options

使ってみる

# 欲しいver.を探す
phpenv install

# 欲しいver.をインストール
phpenv install 5.5.0RC3
# 激しいログの嵐
phpenv install 5.5.5
# 激しいログの嵐 part 2

# 利用するPHP ver.を切り替える(システム全体)
phpenv global 5.5.5

# 利用するPHP ver.を切り替える(カレントDir以下)
phpenv local 5.5.0RC3

httpd で使うPHPのバージョンを変更可能にする

phpenv から apache モジュールを切り替えるpluginを garamon さんが書いているのでインストールする。

git clone https://github.com/garamon/phpenv-apache-version ~/.phpenv/plugins/phpenv-apache-version

自分の環境だけなのか libphp5.so のパスが変だったので読み込むPATHを柔軟にした。

$ git diff --no-prefix HEAD^
diff --git bin/rbenv-apache-version bin/rbenv-apache-version
index 916b9c6..7ed237c 100755
--- bin/rbenv-apache-version
+++ bin/rbenv-apache-version
@@ -38,7 +38,7 @@ if [ -z "$PHPENV_APACHE_MODULE_PATH" ]; then
 fi

 PHPENV_PREFIX_PATH="${RBENV_ROOT}/versions/${PHPENV_APACHE_VERSION}"
-PHP_MODULE_PATH="${PHPENV_PREFIX_PATH}/libphp5.so"
+PHP_MODULE_PATH=`find ${PHPENV_PREFIX_PATH} -name libphp5.so`

 if [ ! -f "$PHP_MODULE_PATH" ]; then
   echo "Make sure the specified version is installed." >&2

ref. https://github.com/masu-mi/phpenv-apache-version/commit/f870723df2ba697d555607a2e68520e40dd2afbd

使ってみる

$ phpenv apache-version 5.5.5

入れ替わる!

ref. http://techblog.allabout.co.jp/2013/08/01/280/

うまく動かせなかったこと

  • Pyrusが機能しない
  • 依存関係の管理は別
  • Lint系が存在しない
  • phpenvの中が結局rbenvなのは良いけれど…

Pyrusが機能しない

pyrus経由でライブラリをインストール出来るって書いたのだけど失敗しました。

依存関係の管理は別

PyrusはBundlerみたいにローカル環境に入れたいpkgリストから解決みたいな事が出来ない。 Onion ってのがあるらしいけどpear, peclから独立してるのとpear, peclを使う。

「あれ、じゃあモダンなpyrusとの関係は?」って思った。

Lint系が存在しない

php lint とかでググったけど見当たらない。 php -l だとスタティックメソッドで $this 使っても引っかからない。

phpenvの中が結局rbenv

phpenv を叩いて出てくるメッセージとかが rbenv って自覚している文言で悲しい。