Cloud9でPHPを5.6にバージョンアップする

# はじめに
Cloud9のPHPのテンプレートだと、現状ではPHPが5.5[^デフォルトPHPバージョンについて] になっているので、5.6にバージョンアップする方法をご紹介します。

単純にPHPを5.6に置き換える方法と、**PHPBrew**を利用して既存のバージョンと5.6を共存させる方法の２種類の方法で試してみました。
ただ、PHPBrewを利用する方法については、PHPBrewを使いこなせていないこともあって実際には何かしらの不具合[^PHPBrewを利用した場合の問題点について] があるかもしれません。その点を予めご理解いただいた上で参考にしてください。

それから、元々インフラ周りは得意ではないので、説明に不備があるかもしれませんがご容赦ください。

# バージョンアップ手順

## 単純に置き換える方法

### apache2のPHP5.6用モジュールをインストール

```bash
$ sudo add-apt-repository ppa:ondrej/php
$ sudo apt-get update
$ sudo apt-get install libapache2-mod-php5.6
```
この時点で、おそらくPHP5.6はインストールされます。

### apache2の設定を5.6用に変更
実際にApacheを起動した際に、ApacheがPHP5.6のモジュールを参照するように設定を変更します。

```bash
$ sudo a2dismod php5
$ sudo a2enmod php5.6
```

### Ubuntuのディストリビューションをアップグレード

```bash
$ sudo add-apt-repository ppa:ondrej/php5-compat
$ sudo apt-get update
$ sudo apt-get dist-upgrade
```
これで依存関係が解決されるはずです。

以上で既存のPHPを5.6にバージョンアップする方法は完了です。

## **PHPBrew**を利用する方法
[GitHub上のREADMEファイル][link-PHPBrew_README] に記載されている内容をそのまま実行していくだけです。

### 事前準備

```bash
$ sudo apt-get update

$ sudo apt-get build-dep php5
$ sudo apt-get install -y php5 php5-dev php-pear autoconf automake curl libcurl3-openssl-dev build-essential libxslt1-dev re2c libxml2 libxml2-dev php5-cli bison libbz2-dev libreadline-dev
$ sudo apt-get install -y libfreetype6 libfreetype6-dev libpng12-0 libpng12-dev libjpeg-dev libjpeg8-dev libjpeg8  libgd-dev libgd3 libxpm4 libltdl7 libltdl-dev
$ sudo apt-get install -y libssl-dev openssl
$ sudo apt-get install -y gettext libgettextpo-dev libgettextpo0
$ sudo apt-get install -y libicu-dev
$ sudo apt-get install -y libmhash-dev libmhash2
$ sudo apt-get install -y libmcrypt-dev libmcrypt4
```

### PHPBrewをインストール

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

### 初期化

```bash
$ phpbrew init
```

### .bashrc の拡張
ホームディレクトリに設置されている .bashrc(~/.bashrc) に以下の内容を追記します。

```bash
[[ -e ~/.phpbrew/bashrc ]] && . ~/.phpbrew/bashrc
```
ファイルの編集が終わったら、`. ~/.bashrc` で再読み込みをするか、ターミナルを起動し直してください。

### デフォルトプレフィックスをUbuntu用に設定

```bash
$ phpbrew lookup-prefix ubuntu
```

### Apacheの関連ディレクトリのパーミッションを変更

```bash
$ sudo chmod -R oga+rw /usr/lib/apache2/modules
$ sudo chmod -R oga+rw /etc/apache2
```

### PHPのインストール
PHPのconfigureオプションは、**variant**というPHPBrew独自のフォーマットで指定することになっています。

```bash
$ phpbrew -d install 5.6 +default+debug+mysql+pdo+apxs2
```
開発者個々に変わってくる部分はここになるのかなと思います。
ご自身の要件に合わせてカスタマイズしたい場合は、[README][link-PHPBrew_README] を参考にしてください。variantの説明が記載されています。

### インストールしたPHPのリストを確認する

```bash
$ phpbrew list
```
**「php-5.～」** の形式で表示されるはずなので、インストールされたバージョンを確認しておきましょう。

### 切り替え
※**"x"**の部分にはインストールしたPHPのバージョンを指定してください。

```bash
$ phpbrew switch 5.6.x
```
これで`php -v`をして切り替えたバージョンが表示されれば成功です。
ちなみに、デフォルトのPHPに戻したい場合は `phpbrew switch-off` すれば元に戻ります。

以上でPHPBrewを利用したバージョンアップ方法は完了です。
こちらの方法の場合、古いバージョンのPHPもインストールして同一環境上で複数のバージョンでの挙動を確認する、といったことも可能になるかと思います。

### トラブルシューティング

#### インストールでエラーが出たので再度インストールする。。。その前に
インストール作業を再開する前に、`~/.phpbrew`を削除して以下のコマンドを実行してください。

```bash
$ phpbrew self-update
$ phpbrew init
$ phpbrew lookup-prefix ubuntu
```
これをしないと、インストール対象のディストリビューションダウンロード実行時にエラーになってしまって、何度インストールを実行しても先に進めなくなる場合があると思います。

# 注釈一覧
[^デフォルトPHPバージョンについて]: 将来的に変更される可能性はあります。
[^PHPBrewを利用した場合の問題点について]: 開発するものによっては足りないモジュールがあったり、ApacheやMySQLとの連携がうまくいかなかったり、ということが起きるかもしれません。


[link-PHPBrew_README]:https://github.com/phpbrew/phpbrew/blob/master/README.md "PHPBrewのREADME"