Macにanyenv, phpenv, php-builderでPHP7.1.6をインストールしたときのメモ


anyenvでphpenv (+ php-builder) をインストールし、PHP7.1.6をインストールした際に大いにハマったのでのメモを残しておきます。

# 【注意】そのPHP環境、本当に必要？
PHPはサーバーサイドスクリプト言語で、サーバーやデータベースと密接に関係している言語です。MacのローカルにPHPを落としてきて、あなたのやりたいことができそうか、記事を読む前に是非ご確認ください！！

例えば何かフレームワークを利用してPHPのアプリケーションを開発したい場合、そのフレームワークの推奨するインストール方法に従えば、うまくセッティングされた形でPHPがついてくるかもしれません。二度手間を防ぐためにも、ぜひご確認ください！

また、筆者にPHP経験がほぼ無いため、非本質的なことをやっているかもしれません。ご承知おきください。

# スペック
OS: macOS Sierra 10.12.4
anyenv: v0.0.4-dev
PHP: 7.1.6

# anyenvとは
[rbenv](https://github.com/rbenv/rbenv)に代表される、プログラミング言語のバージョンをディレクトリで切り替えられる便利な環境たち（以下 _＊＊env_ と称します）を統合的に管理してくれる便利な環境です。

# anyenvのインストール
[anyenvのREADMEのインストール方法](https://github.com/riywo/anyenv)に従います。
git cloneして.bash_profileなどにパスを追加して初期化コマンドを書くだけ！＼(^o^)／

```
$ git clone https://github.com/riywo/anyenv ~/.anyenv
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.your_profile
$ echo 'eval "$(anyenv init -)"' >> ~/.your_profile
$ exec $SHELL -l
```

# ＊＊envのアンインストール
さて、私はもともとpyenvとrbenvをインストールしていたので、これらをanyenvから扱わせるために一旦削除しました。
＊＊env系を1つもインストールしていない方はスキップしてください。
基本的には以下の3つを各＊＊envに対して行います。

1. `brew uninstall ＊＊env` 
2. .bash_profileなどから＊＊envのパス追加&初期化コマンドを消す
3. `rm -rf ~/.＊＊env`


# phpenvのインストール
anyenvからphpenvをインストールします。
`anyenv install phpenv`

インストールが終わったら以下のコマンドを打ち、シェルを再起動しましょう。
`exec $SHELL -l`

# php7.1.6のインストール
ここからが本番。
インストールコマンドは `phpenv install 7.1.6` なので、まずコレが成功するか試してみましょう。多分どこかでエラーが出ると思いますが、万が一エラーが出なければこれでPHP7.1.6のインストールは完了です！やったね！！^^

以降はphpをインストールする際のエラーに対処していきます。

## brewでopensslをインストール
PHPのインストールにはいろいろなソフトウェアが必要なようですが、それらはbrewでインストールできます。

大半の方はおそらくopensslのところで以下のようなエラーが出るのではないでしょうか。

> configure: error: OpenSSL version 1.0.1 or greater required.

そこで、以下の手順を踏みます。
### 1. brewでopensslをアップグレード
`brew upgrade openssl` でOKです。
opensslがbrewに入ってなければ `brew install openssl` してみてください。

### 2. OSにbrewで入れたopensslを認識させる
インストール後、 `openssl version` してみてください。バージョンは1.0.1以上になっているでしょうか？（たぶんなってないと思います）
`which` コマンドを使って、opensslがどこにインストールされたものが使われているのか調べてみましょう。

``` .sh
$ which openssl
/usr/bin/openssl
```

`/usr/bin/openssl` になっていますね。これはbrewでインストールしたopensslではないので、`~/.bash_profile` などにパスを加えてbrewでインストールしたopensslが優先的に使われるようにしてみましょう。

※ 「phpenv brew openssl」 とかでぐぐると `brew link openssl --force` が効かないという記事がたくさん出てくるとおり、 `brew link` は効かないようです。

```
$ echo 'export PATH="/usr/local/Cellar/openssl/{インストールしたバージョン}/bin:$PATH"' >> ~./{お好きなシェルのprofileなど}
$ exec $SHELL -l
```

これで `which openssl` して指定したパスが表示され、 `openssl version` でインストールしたバージョンが表示されればとりあえずOKです。

## brewでその他のソフトウェアをインストール
以下の記事を参考にして、私はlibxml2、mcrypt、autoconf、automake、bisonをbrewでインストールしました。
https://teratail.com/questions/51089


それから、私はautoconfが`brew list`には含まれていたので大丈夫だろうと思い、特にコマンドを打たなかったのですが、autoconfが有効化されておらず、phpのインストール時にエラーになりました。

`brew link autoconf`で有効化しましょう。

## `phpenv install 7.1.6`時にopensslなどのパスを与える
さて、Macが最新のopensslを参照してくれるようになっても、`phpenv install 7.1.6`しても同じところでエラーになるのではないでしょうか。どうやらこれはphp-buildに設定を書く必要があるようです。

2017年現在、php-buildはphpenvのインストール時にプラグインとして同時に入ってきます。このphp-buildがいろいろなバージョンのphpをビルドしてくれるのですが、これがbrewで入れた最新のopensslを見てくれていない、というのが原因のようです。

なので`phpenv install` コマンド実行時にパスが指定されるように、以下のファイルを編集します。

``` /.anyenv/envs/phpenv/plugins/php-build/share/php-build/default_configure_options
--with-openssl=/usr/local/opt/openssl
--with-mcrypt=/usr/local/opt/mcrypt
--with-libxml-dir=/usr/local/opt/libxml2
YACC=/usr/local/opt/bison/bin/bison
```
環境変数についてはこの記事も参考にしました。
http://qiita.com/Hiraku/items/33372d2c60b3ceb26e52

php-buildについては、以下の記事がとても詳しいので参考になると思います。
http://y-uti.hatenablog.jp/entry/2015/12/11/091058

## php-buildのソースコードを編集する 
最後に、php-buildのソースコードを編集します。
[**この記事**](http://qiita.com/omega999/items/c5b1c177331f8d342efd#%E3%82%A8%E3%83%A9%E3%83%BC%E5%8E%9F%E5%9B%A0%E3%82%92%E7%89%B9%E5%AE%9A%E3%81%99%E3%82%8B)の[**このコメント**](http://qiitA.com/omega999/items/c5b1c177331f8d342efd#comment-e45216c9d01a57d3af46
)に従い、該当コードを以下のように変更します(dev/nullを消す)。

```　~/.anyenv/envs/phpenv/plugins/php-build/share/php-build/extension/extension.sh

   {
       $PREFIX/bin/phpize
   "$(pwd)/configure" --with-php-config=$PREFIX/bin/php-config\
\
           $configure_args
 
       make
   make install
   } >&4 2>&1
```

これで完了です！！
再度 `phpenv install 7.1.6` してみましょう！！




# おわりに
いろいろググってみると先人たちもphpのインストールにとても苦労している印象を受けました（私も相当時間を持っていかれました…）。
なので最初に書いたように、**macのローカルにPHP環境を直に構築する必要があるのか？他の方法でPHPをインストールしたほうがいいのではないか？** を是非検討するとよいと思います！