【Homebrew】PHPの設定に注意！〜Homebrew/phpの廃止〜

# いつものPHPじゃない！

ふと、PHPの場所を確認してみた。

```
$ which php
/usr/bin/php
```

・・・Homebrewで入れたやつと場所違くない？これ、Macのデフォルトのやつじゃね？

自分の開発環境では、HomebrewもMacのデフォルトも両方7.1系だったため、今まで気がつかなかったのだ。

これが気になり一時作業を中断。詳細を確認することにした。

# 環境変数の確認

HomebrewのPHPが使用されていれば、``whichコマンド``で以下の場所が表示されるはずだ。少なくとも、2018年2月はこうだった。

```
$ which php
/usr/local/bin/php
```

そのための設定がされているか、``.bash_profile``を確認した。しかし、問題は無さそうだ。

```sh
export PATH=$HOME/.nodebrew/current/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$HOME/bin:$HOME/.composer/vendor/bin
eval "$(rbenv init -)"

if [ -f ~/.bashrc ]; then
    ~/.bashrc
fi
```

# ライブラリの確認

## エラーメッセージの内容

原因が環境変数でないならば、直接``Homebrewのphpコマンド``を実行し、動作を確認してみることにした。

```
$ /usr/local/cellar/php71/7.1.16/bin/php -v
```

```
$ /usr/local/cellar/php71/7.1.13_24/bin/php -v
```

これらのコマンドで同様のエラーメッセージが発生した。HomebrewでインストールしたPHPが動かずにMacのデフォルト版が動いていた原因は、これだった。

この時はエラーメッセージの内容をそのまま信じ、ライブラリの読み込みに問題があると思っていた。

```
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/opt/php71-intl/intl.so' - dlopen(/usr/local/opt/php71-intl/intl.so, 9): Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.60.dylib
  Referenced from: /usr/local/opt/php71-intl/intl.so
  Reason: image not found in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library '/usr/local/opt/php71-intl/intl.so' - dlopen(/usr/local/opt/php71-intl/intl.so, 9): Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.60.dylib
  Referenced from: /usr/local/opt/php71-intl/intl.so
  Reason: image not found in Unknown on line 0
PHP 7.1.13 (cli) (built: Jan  5 2018 15:31:15) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.1.16, Copyright (c) 1999-2018, by Zend Technologies
```

## php.iniの修正

当時はエラーメッセージ内の``Unable to load dynamic library '/usr/local/opt/php71-intl/intl.so'``から、``ライブラリの読み込みが正常に出来ていない``と判断していた。（後に間違いと判明する。）

そのため、``php.ini``に該当のディレクトリを読み込むように設定し、サーバを再起動した。

```php.ini
# 省略

extension_dir = "/usr/local/opt/php71-intl"

# 省略
```

```
$ sudo apachectl restart
```

ここで再びphpコマンドを試したが、先程と同じエラーメッセージが出現。ダメだったか・・・。

# Homebrewのupgrade

解決策が思いつかなかったので、おもむろにHomebrewの``upgrade``を実行した。``upgradeはupdateとは異なるコマンドだ。``自分は今まで深く考えずに使っていたが；

[【Mac】Homebrewアップデート時のコマンド一式](http://mzgkworks.hateblo.jp/entry/homebrew-update-flow)

初めに``outdatedコマンド``でupgrade対象のパッケージを確認する。おや、phpのようすが・・・？（アットマーク付いてるけど・・・）

```
$ brew outdated

# 省略

php@7.1 (7.1.13_24, 7.1.16) < 7.1.17

# 省略
```

```
$ brew upgrade

# 省略
```

すると、``php@7.1``をupgradeしている途中で、こんなメッセージを発見。

```
If you need to have this software first in your PATH run:
  echo 'export PATH="/usr/local/opt/php@7.1/bin:$PATH"' >> ~/.bash_profile
  echo 'export PATH="/usr/local/opt/php@7.1/sbin:$PATH"' >> ~/.bash_profile
```

やはり環境変数が間違っていたのだろうか？無事upgradeが終了した後、メッセージ通り環境変数を登録し、反映させた。

```
$ echo 'export PATH="/usr/local/opt/php@7.1/bin:$PATH"' >> ~/.bash_profile
$ echo 'export PATH="/usr/local/opt/php@7.1/sbin:$PATH"' >> ~/.bash_profile
$ source .bash_profile
```

その後phpコマンドを実行したが・・・やはりダメだった。

# 本当の原因

ダメ元でエラーメッセージをそのままGoogle検索したら、予想外に同じ悩みを抱えている人が多かった。結局、原因はこうだった。


Homebrew公式のGitHubリポジトリより抜粋。

``` README.md
Homebrew/php (deprecated)

These formulae were relating to PHP.

As announced on the 19th of January this tap was archived on 31st March 2018.

All formulae were migrated to Homebrew/homebrew-core or deleted.
```

Homebrewが``Homebrew/phpをdeprecated（廃止）``したことが全ての原因だった。さらに、以下の作業が必要なことが判明した。

-  ``conf.d``ディレクトリ内のファイルを削除する。
-  Homebrew/phpを``untap（リポジトリを削除）``する。

ここで参考にしたサイト様は最後にまとめて紹介する。正解にたどり着くまでやたらと右往左往していたが、解決策は超シンプル。この２つのコマンドを実行するだけだった。

```
$ rm /usr/local/etc/php/7.1/conf.d/*
```

```
$ brew untap homebrew/php
Untapping homebrew/php... (87 files, 2MB)
Untapped 0 formulae
```

念のためサーバも再起動。

```
$ sudo apachectl restart
```

phpコマンドが素直に通った！

```
$ php -v
PHP 7.1.17 (cli) (built: Apr 26 2018 22:04:27) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
```

パスも問題なし！

```
$ which php
/usr/local/opt/php@7.1/bin/php
```

``php71とphp@7.1の違い``は何なのか、細かい部分については正直よくわからないが；まあ、これで心置きなく作業できる。

# 参考にしたサイト様

こちらのサイト様に出会わなければ、今回の問題は解決しなかっただろう。本当に感謝している。

[homebrewでphp71-*系がインストールできなくなってた](http://rskull.hateblo.jp/entry/2018/04/06/164236)
[Mac OS Homebrew の PHP 関連の formulae 変更されて大変だった (2018年4月)](https://qiita.com/katzueno/items/5e65ddc65f09cc1e1ec7)

海外でも悩みは同じ。英語のドキュメントも読めるようになりたいなあ。以下のやり取りは、公式リポジトリの``Issues``にあったものだ。（既にClosedされている。）

[Unable to load dynamic library '/usr/local/opt/php71-intl/intl.so'?](https://github.com/Homebrew/homebrew-core/issues/26074)

はじめの``環境変数〜ライブラリの確認``については、以下のサイト様を参考にした。結果として直接の解決策にはならなかったが、エラー発生時の確認作業の流れについて色々学ばせていただいた。

[MacのPHPをphp7へ変更(HomeBrewでPHP71のインストール)](https://info.yama-lab.com/macのphpをphp7へ変更/)
[【PHP】追加したモジュールが読み込めない時に疑うポイント](https://qiita.com/nnmr/items/778c3e9c4dbb7fb25a73)

今回はここまで。