いつもの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
に該当のディレクトリを読み込むように設定し、サーバを再起動した。
# 省略
extension_dir = "/usr/local/opt/php71-intl"
# 省略
$ sudo apachectl restart
ここで再びphpコマンドを試したが、先程と同じエラーメッセージが出現。ダメだったか・・・。
Homebrewのupgrade
解決策が思いつかなかったので、おもむろにHomebrewのupgrade
を実行した。upgradeはupdateとは異なるコマンドだ。
自分は今まで深く考えずに使っていたが;
初めに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リポジトリより抜粋。
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】追加したモジュールが読み込めない時に疑うポイント
今回はここまで。