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

More than 1 year has passed since last update.


いつもの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を確認した。しかし、問題は無さそうだ。

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アップデート時のコマンド一式

初めに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(リポジトリを削除)する。

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

$ 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-*系がインストールできなくなってた

Mac OS Homebrew の PHP 関連の formulae 変更されて大変だった (2018年4月)

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

Unable to load dynamic library '/usr/local/opt/php71-intl/intl.so'?

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

MacのPHPをphp7へ変更(HomeBrewでPHP71のインストール)

【PHP】追加したモジュールが読み込めない時に疑うポイント

今回はここまで。