Ubuntu に phpenv を入れて複数バージョンのPHP管理しようとした

brew の場合は楽そうなかんじなのに、Ubuntu だとわりと手間取った。

Ubuntu で phpenv 入れてる詳しい説明は少なそうだったので、同じところでつまづいてる人用に共有してみます。

基本的にデザインとフロント担当なのでお前は何を言っているんだ的なところがあったら教えてください。

やりたいこと
--------------------------------------------------------------------------------

  * 手軽に PHP のバージョンを切り替える開発環境を作りたい
    + 引き継いだレガシー案件に古いPHPバージョン依存のコードがあったので


Install
--------------------------------------------------------------------------------

### 1. Install phpenv

PHPのバージョン切り替えたりするやつです。

``` sh
# Install phpenv
$ cd ~
$ git clone https://github.com/CHH/phpenv.git ~/.phpenv
$ sh ~/.phpenv/bin/phpenv-install.sh
```

### 2. Install php-build

PHPビルドするやつです。

``` sh
# Install php-build
$ git clone git://github.com/CHH/php-build.git
$ cd php-build/
$ sudo paco -D sh install.sh # paco を好みで使う
$ which php-build
/usr/local/bin/php-build
$ rm -rf php-build
```

php-build インストール時にどこにどんなファイルが配置されたか記録しておくために、paco を使っています。使っても使わなくてもいいやつです。

### 3. path 設定

``` sh:~/.zshrc

# rbenv & phpenv
# .rbenv ディレクトリが home にあればパスを通す
# phpenv は rbenv を内部利用しているので先に rbenv に PATH を通す
if [ -d $HOME/.rbenv/bin ]; then
  export PATH="$PATH:$HOME/.rbenv/bin"
  eval "$(rbenv init -)"
  if [ -d $HOME/.phpenv/bin ]; then
    export PATH="$PATH:$HOME/.rbenv/bin:$HOME/.phpenv/bin"
    eval "$(phpenv init -)"
  fi
fi
```


php-build で PHP をビルドする
--------------------------------------------------------------------------------

### 1. インストール可能なバージョン一覧の表示

``` sh
$ php-build --definitions
5.2.17
5.3.10
5.3.11
   :
5.5.0beta1
5.5.0beta2
5.5snapshot
```

### 2. 依存パッケージのインストール

PHPビルド時にパッケージが足りないようなので、トライアンドエラーで、言われるままに大量にインストールする。

  * libcurl4-gnutls-dev
  * libcurl4-nss-dev
  * libcurl4-gnutls-dev
  * libpng3 libjpeg-dev
  * re2c
  * libxml2-dev
  * openssl-dev
  * libtidy-dev
  * libxslt-dev
  * libmcrypt-dev
  * libreadline-dev

今回は上のリストを全てインストール。

``` sh
$ sudo aptitude install libcurl4-gnutls-dev libcurl4-nss-dev libcurl4-gnutls-dev libpng3 libjpeg-dev re2c libxml2-dev openssl-dev libtidy-dev libxslt-dev libmcrypt-dev  libreadline-dev
```

#### 3. apxs2 の用意

debian/ubuntu の場合、 さらに `apxs2` コマンドを使えるようにしておかないと、
PHPビルド時に `libphp5.so` を作成できないぽいので入れる。

``` sh
$ apache2 -V
Server version: Apache/2.2.22 (Ubuntu)
     :
Server MPM:     Prefork
     :
```

`Server MPM` の値が `Prefork` だった場合、`apache2-prefork-dev`、
`worker` の場合、`apache2-threaded-dev` が必要。

``` sh
    $ sudo aptitude install apache2-prefork-dev
```

PHPビルド時の設定に `libphp5.so` を作成するオプションを追記。

`default_configure_options ` に `--enable-fpm` がある場合は削除しておく。
このあたりは、CLI版, CGI版 どちらでビルドするかで変わるぽい。

``` sh
$ which apxs2
/usr/bin/apxs2

$ sudo vim /usr/local/share/php-build/default_configure_options
     :
--with-apxs2=--with-apxs2=/usr/bin/apxs2  # << 追記
```

### 4. libphp5.so のバックアップ

PHPビルド時に、`libphp5.so` が上書きされるため、現在のバージョンのものをバックアップする。

``` sh
$ mkdir ~/.phpenv/versions/CURRENT_PHP_VER/
$ mv /usr/lib/apache2/modules/libphp5.so ~/.phpenv/versions/CURRENT_PHP_VER/
```


### 5. PHP のビルド, インストール

phpenv で管理できるようにするため、`~/.phpenv/versions` をインストール先として
指定する。

``` sh
$ php-build 5.3.19 ~/.phpenv/versions/5.3.19

[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.3.19 into /home/qurage/.phpenv/versions/5.3.19
[Skipping]: Already downloaded and extracted http://downloads.php.net/johannes/php-5.3.19.tar.bz2
[Preparing]: /tmp/php-build/source/5.3.19
[Compiling]: /tmp/php-build/source/5.3.19
[Pyrus]: Downloading from http://pear2.php.net/pyrus.phar
[Pyrus]: Installing executable in /home/qurage/.phpenv/versions/5.3.19/bin/pyrus
[XDebug]: Downloading http://xdebug.org/files/xdebug-2.2.1.tgz
[XDebug]: Compiling in /tmp/php-build/source/xdebug-2.2.1
[XDebug]: Installing XDebug configuration in /home/qurage/.phpenv/versions/5.3.19/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.3.19.20130409111047.log
[Success]: Built 5.3.19 successfully.
```
phpenv からビルドしたPHPが正しく認識されているか確認。

``` sh
$ phpenv versions
* system (set by /home/qurage/.phpenv/version)
  5.3.19
```

`libphp5.so` はPHPをビルドするたびに上書きされるため、
バージョンごとに移動･保存しておく。

``` sh
$ sudo cp /usr/lib/apache2/modules/libphp5.so ~/.phpenv/versions/5.3.19/
```

PHP バージョン切り替え
--------------------------------------------------------------------------------

``` sh
$ phpenv global 5.3.19

$ phpenv versions
  system
* 5.3.19 (set by /home/qurage/.php-version)

$ phpenv rehash
```

### Apache 側の設定

phpenv でバージョン切り替えしただけでは、Apache 側には未適用なので、phpenv-apache-version プラグインを利用する。

``` sh
$ git clone https://github.com/garamon/phpenv-apache-version .phpenv/plugins/phpenv-apache-version/

$ sudo /home/qurage/.phpenv/bin/phpenv apache-version 5.3.19
```

phpinfo(); などで Apache 側の動作確認。


### php.ini 設定

``` ini:~/.phpenv/versions/5.3.19/etc/php.ini

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Asia/Tokyo
     :
; Default socket name for local MySQL connects.  If empty, uses the built-in
; MySQL defaults.
; http://php.net/pdo_mysql.default-socket
pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock
     :
; Default socket name for local MySQL connects.  If empty, uses the built-in
; MySQL defaults.
; http://php.net/mysql.default-socket
mysql.default_socket = /var/run/mysqld/mysqld.sock
     :
; Default socket name for local MySQL connects.  If empty, uses the built-in
; MySQL defaults.
; http://php.net/mysqli.default-socket
mysqli.default_socket = /var/run/mysqld/mysqld.sock
```

mysql の socket パスは適宜変更する必要がある。

  * Ubuntu ⇒ /var/run/mysqld/mysqld.sock
  * CentOS ⇒ /tmp/mysql.sock


あとがき
--------------------------------------------------------------------------------

なかなか大変でした。

参考にしたサイト
--------------------------------------------------------------------------------

  1. [phpenv で複数の PHP 環境を管理する - Born Too Late][1]
  2. [Ubuntu 9.0.4 へ PHP5.3.0 動作環境を作る - 気が向いたら][2]
  3. [Hunting Field: もう一度php-5.3.8を入れる][3]

[1]: http://blog.yuyat.jp/archives/1446
[2]: http://d.hatena.ne.jp/tksthdnr/20090721/1248189454
[3]: http://kokukuma.blogspot.jp/2011/09/php-538.html