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

主な欲求は2つ。

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

PHPでの実装

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

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

phpenv導入

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

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

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

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

1
2
3
# for building php
brew install re2c
brew install libmcrypt

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

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

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

1
2
3
4
5
6
7
# 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 系おなじみの修正を加える。

1
2
3
4
5
6
7
# 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が冗長になるのを避ける為に関数を挟んでる。

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

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

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

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

使ってみる

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 欲しいver.を探す
$ phpenv install

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

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

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

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

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

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
$ 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

使ってみる

1
$ 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って自覚していて悲しい。

comments powered by Disqus