Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

【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】追加したモジュールが読み込めない時に疑うポイント

今回はここまで。

yukibe
2018年8月よりWebエンジニア。主にPHP。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away