phpenvをシステムワイドにインストールする方法


[rbenvを使ってシステムワイドにrubyをインストールする方法](http://qiita.com/items/8e973a544b592376a07e)を読んでphpenvでもいけるんじゃね？と思ってやってみたらできた時のメモ


環境 virtualbox 

* centos6.3（ゲストOS）macosx10.8(ホストOS)
* 要gitインストール済の環境
* rbenv ※入れていない方は[virtualbox(centos)でrbenvインストールメモ](http://qiita.com/items/1cb882b48b1a827a420d)を参照してください


## phpenvとは

[ここ](http://qiita.com/items/7d031440bb174a55a6a1)参照してください。


## 参考にしたサイト

* [rbenvを使ってシステムワイドにrubyをインストールする方法](http://qiita.com/items/8e973a544b592376a07e)
* [garamon / phpenv-apache-version](https://github.com/garamon/phpenv-apache-version)

※以降は全てroot権限で実行しています

## phpenvのインストール

サクッと一発ワンライナー

```shell
curl https://raw.github.com/CHH/phpenv/master/bin/phpenv-install.sh | sh


installing phpenv in /root/.phpenv
remote: Counting objects: 1456, done.
remote: Compressing objects: 100% (556/556), done.
remote: Total 1456 (delta 938), reused 1367 (delta 871)
Receiving objects: 100% (1456/1456), 209.95 KiB | 142 KiB/s, done.
Resolving deltas: 100% (938/938), done.
Success.

export PATH="/root/.phpenv/bin:$PATH"
eval "$(phpenv init -)"

Add above line at the end of your ~/.bashrc and restart your shell to use phpenv.
```

.bashrcにPATHとinit処理書けよ！！って言われるがシステムワイドに入れたいので今回はスルーする

## ~/.phpenvの移動

デフォルトで~/.phpenvにソースが配置されるので移動する

```shell:/etc/profile.d/rbenv.sh
mv ~/.phpenv /usr/local/phpenv
chmod 775 -R /usr/local/phpenv
```

## /etc/profile.d/rbenv.shに追記する

rbenv initより後に実行されないとphpenvがエラーになりますので
今回は/etc/profile.d/rbenv.shに追記します
(rbenv.shがない方は[virtualbox(centos)でrbenvインストールメモ](http://qiita.com/items/1cb882b48b1a827a420d)を参考してください)

```shell:/etc/profile.d/rbenv.sh
export RBENV_ROOT=/usr/local/rbenv
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"

#下記を最後に追加
export PATH="/usr/local/phpenv/bin:$PATH"
eval "$(phpenv init -)"
```

## /usr/local/phpenv/bin/phpenvのRBENV_ROOTを変更する

デフォルトだと~/.phpenvになってるので変更する

```shell:/usr/local/phpenv/bin/phpenv
#変更
export RBENV_ROOT='/usr/local/phpenv'
```

その後にsourceコマンドで反映させる

```shell
source /etc/profile.d/rbenv.sh
```


でコマンド叩いて確認しましょ

```shell
phpenv

rbenv 0.4.0-13-ge3f72eb
Usage: rbenv <command> [<args>]

Some useful rbenv commands are:
   commands    List all available rbenv commands
   local       Set or show the local application-specific Ruby version
   global      Set or show the global Ruby version
   shell       Set or show the shell-specific Ruby version
   install     Install a Ruby version using the ruby-build plugin
   uninstall   Uninstall a specific Ruby version
   rehash      Rehash rbenv shims (run this after installing executables)
   version     Show the current Ruby version and its origin
   versions    List all Ruby versions available to rbenv
   which       Display the full path to an executable
   whence      List all Ruby versions that contain the given executable

See `rbenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/sstephenson/rbenv#readme

#こんな感じのコマンドが表示されていればOK
```

## php-buildのインストール

最近の流行りはphpenvのpluginとして使うのがナウなやり方らしいのでそちらの方法にしてみる

```shell
mkdir -p /usr/local/phpenv/plugins
cd /usr/local/phpenv/plugins
git clone git://github.com/CHH/php-build.git
curl https://raw.github.com/CHH/php-build/plugin-to-chh-phpenv/bin/rbenv-install > php-build/bin/rbenv-install
chmod 755 php-build/bin/rbenv-install

```

入っているかの確認

```shell
phpenv install 
usage: phpenv install VERSION

Available versions:
 5.2.17
 5.3.10
 5.3.11
 5.3.11RC1
 5.3.11RC2
 5.3.12
 5.3.13
 5.3.14
 5.3.15
 5.3.16
 5.3.17
 5.3.18
 5.3.19
 5.3.19RC1
 5.3.2
 5.3.20
 5.3.20RC1
 5.3.21
 5.3.3
 .
 .
 .
#上記のような表示がされればOK
```

## phpenv-apache-version　Pluginの追加

apacheのphp変更とphpのバージョンの切り替えができる優れもののpluginがあるので使用しましょう。

```shell
cd /usr/local/phpenv/plugins
git clone git://github.com/garamon/phpenv-apache-version
```

## PHPをビルド（今回は5.4.11）

全部入りを下記のブログを参照してやった
[phpenv + php-build を使って 5.3 と 5.4 を共存させつつ php-fpm を使う](http://d.hatena.ne.jp/sotarok/20120522/php_fpm_with_phpenv_and_php_build)
自分はfpm入れてnginxも使用したいと思ったのでこれを参考にした
オプション色々入れないなら依存パッケージがもっと減って下記のyumがもっとやりやすい

またphp-fpmは一回目のインストールした後に他のバージョンでも入れようとすると

```shell
You've configured multiple SAPIs to be build. You can build only
one SAPI module and CLI binary at the same time.
```

と怒られる。
調べたがよくわからず
[ココ](http://ringogirl.hatenablog.jp/entry/2013/02/08/111329)できっとphp-fpmは「複数入れられないんだなきっと」と納得して
諦めてphp-fpmはバージョンが切り替えは諦めました。
ていうかきっと誰かすごい人が作ってくれるでしょう。

## 依存モジュールのinstall(centos)

ここで結構ハマった。依存モジュール(centos内)が結構あったので
クリーンな環境だと下記のモジュールのインストールが必要
というかエラーが出た場合は基本「モジュール足らないよバカヤロー!!」が多いので
エラーを見てググって yum install をひたすら繰り返す

```shell
#epelのリポジトリがない場合はhttp://qiita.com/items/662e41376efa97251575を参照して追加してください
yum --enablerepo=epel install re2c libmcrypt libmcrypt-devel
yum install libxml2-devel bison bison-devel openssl-devel curl-devel libjpeg-devel libpng-devel libmcrypt-devel readline-devel libtidy-devel libxslt-devel httpd-devel enchant-devel libXpm libXpm-devel freetype-devel t1lib t1lib-devel gmp-devel libc-client-devel libicu-devel oniguruma-devel net-snmp net-snmp-devel bzip2-devel
```

PHP入れるのにこんなに依存関係あるのね。。。驚き。。。。

## defaultのconfigureオプションの追加
configureオプションを追加しましょう（今回は全部入りなので）

```shell:/usr/local/phpenv/plugins/php-build/share/php-build/default_configure_options
--without-pear
--with-gd
--enable-sockets
--with-jpeg-dir=/usr
--with-png-dir=/usr
--enable-exif
--enable-zip
--with-zlib
--with-zlib-dir=/usr
--with-kerberos
--with-openssl
--with-mcrypt=/usr
--enable-soap
--enable-xmlreader
--with-xsl
--enable-ftp
--enable-cgi
--with-curl=/usr
--with-tidy
--with-xmlrpc
--enable-sysvsem
--enable-sysvshm
--enable-shmop
--with-mysql=mysqlnd
--with-mysqli=mysqlnd
--with-pdo-mysql=mysqlnd
--with-pdo-sqlite
--enable-pcntl
--with-readline
--enable-mbstring
--disable-debug
--with-apxs2=/usr/sbin/apxs
--enable-fileinfo
--enable-hash
--enable-json
--enable-sysvmsg
--enable-bcmath
--with-bz2
--enable-ctype
--with-iconv
--enable-ftp
--with-gettext
--enable-mbstring
--with-onig=/usr
--with-pcre-regex
--with-mysql-sock=/tmp/mysql.sock
--enable-phar
--enable-shmop
--enable-sockets
--enable-simplexml
--enable-dom
--with-libxml-dir=/usr
--enable-tokenizer
--with-kerberos=/usr
--with-openssl=/usr
--enable-zip
--with-mhash=yes
--without-mm
--with-enchant=/usr
--enable-gd-native-ttf
--with-gmp=/usr
--with-xpm-dir=/usr/X11R6
--with-freetype-dir=/usr
--with-imap=/usr
--with-imap-ssl
--enable-intl
--with-t1lib=/usr
--with-snmp=/usr
```

※mysqlはmysqld_multiなどでmysql.sockを変更していたら適時mysql.sockのパスに変更してください

### php-buildの設定(php-fpm込)

上記の問題があるので最新版のphp-fpmを持ってくる予定なので
最初に最新版の5.4.11をインストールする


```/root/.phpenv/pluginsshare/php-build/definitions/5.4.11
vim /usr/local/share/php-build/definitions/5.4.11

#下記を先頭に追加
configure_option "--enable-fpm"
```


そして実行

```shell
phpenv install 5.4.11


[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.11 into /root/.phpenv/versions/5.4.11
[Downloading]: http://php.net/distributions/php-5.4.11.tar.bz2
[Preparing]: /var/tmp/php-build/source/5.4.11
[Compiling]: /var/tmp/php-build/source/5.4.11
[Pyrus]: Downloading from http://pear2.php.net/pyrus.phar
[Pyrus]: Installing executable in /root/.phpenv/versions/5.4.11/bin/pyrus
[XDebug]: Downloading http://xdebug.org/files/xdebug-2.2.1.tgz
[XDebug]: Compiling in /var/tmp/php-build/source/xdebug-2.2.1
[XDebug]: Installing XDebug configuration in /root/.phpenv/versions/5.4.11/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.11.20130219025032.log
[Success]: Built 5.4.11 successfully.
#入った 
```

### liphp5.soの退避

退避しないと他のバージョン入れた時に上書きしてしまうので移動する

```shell
mv /etc/httpd/modules/libphp5.so /root/.phpenv/versions/5.4.11/
```

## PHPをビルド（5.3.21）

先程も説明した通りphp-fpmを入れようとするとエラーになるので今度は
/usr/local/share/php-build/definitions/5.3.21のconfigure_optionのfpmを--disable-fpmに変更する
（php-fpmを入れないようにする）


```/usr/local/phpenv/plugins/php-build/share/php-build/definitions/5.3.21
#下記を先頭に追加
configure_option "--disable-fpm"
```


インストールする

```shell
phpenv install 5.3.21


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.21 into /root/.phpenv/versions/5.3.21
[Downloading]: http://php.net/distributions/php-5.3.21.tar.bz2
[Preparing]: /var/tmp/php-build/source/5.3.21
[Compiling]: /var/tmp/php-build/source/5.3.21
[Pyrus]: Downloading from http://pear2.php.net/pyrus.phar
[Pyrus]: Installing executable in /root/.phpenv/versions/5.3.21/bin/pyrus
[XDebug]: Downloading http://xdebug.org/files/xdebug-2.2.1.tgz
[XDebug]: Compiling in /var/tmp/php-build/source/xdebug-2.2.1
[XDebug]: Installing XDebug configuration in /root/.phpenv/versions/5.3.21/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.21.20130219030118.log
[Success]: Built 5.3.21 successfully.
#入った 
```

### liphp5.soの退避

退避しないと他のバージョン入れた時に上書きしてしまうので移動する

```shell
mv /etc/httpd/modules/libphp5.so /root/.phpenv/versions/5.3.21/
```


## http.confの設定変更

ここらへんは[モダンなPHP開発環境を構築する
phpenv + php-build で 複数のPHPバージョンを管理する
](http://creator-life.net/modern-php-env/)の内容をそのまま持ってきてます
(設定項目があれば変更する)


```/etc/httpd/conf/httpd.conf
#LoadModule php5_module        /usr/lib/httpd/modules/libphp5.so  ← コメントアウト
```

でphp用の設定を/etc/httpd/conf.d/php.confに書き出す

```/etc/httpd/conf.d/php.conf
 
#
# PHP is an HTML-embedded scripting language which attempts to make it
# easy for developers to write dynamically generated webpages.
#
 
LoadModule php5_module modules/libphp5.so
 
#
# Cause the PHP interpreter to handle files with a .php extension.
#
AddHandler php5-script .php
AddType text/html .php
 
#
# Add index.php to the list of files that will be served as directory
# indexes.
#
DirectoryIndex index.php
 
#
# Uncomment the following line to allow PHP to pretty-print .phps
# files as PHP source code:
#
#AddType application/x-httpd-php-source .phps

```


## PHP(cli)のバージョンが切り替わるか確認

コマンドラインのphpが切り替われるか確認する

```shell
phpenv rehash
php -v


rbenv: php: command not found

The `php' command exists in these Ruby versions:
  5.3.21
  5.4.11

#phpを複数入れてるのでどのバージョン使用するか決めてね！！ってエラーなんで

phpenv global 5.4.11
php -v


PHP 5.4.11 (cli) (built: Feb 19 2013 02:55:49) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
    with Xdebug v2.2.1, Copyright (c) 2002-2012, by Derick Rethans

#5.4.11になった


phpenv global 5.3.21
php -v


PHP 5.3.21 (cli) (built: Feb 19 2013 03:06:35) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2013 Zend Technologies
    with Xdebug v2.2.1, Copyright (c) 2002-2012, by Derick Rethans

#5.3.21になった
```

## apacheモジュールが切り替えられるか確認する

```shell
phpenv apache-version 5.4.11
copy /root/.phpenv/versions/5.4.11/libphp5.so to /etc/httpd/modules
Restarting apache...
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

#apacheの再起動と退避したlibphp5.soの切り替えを行う
```


## ブラウザで確認してPHPが切り替わっているか確認する

[http://localhost/phpinfo.php]()とか作って

```shell
<?php
phpinfo();
```

と書いてアクセスしてPHPのバージョンが変わって入ればOK!!