🐘
PHPが突然Library not loaded: /path/to/libicui18n.64.dylibとか言い出したときの対処法
起こったこと
phpenvで入れているPHPが、ある日突然以下のようなエラーで動作しなくなりました🙄
$ php -v
dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicuio.64.dylib
Referenced from: /Users/xxx/.phpenv/versions/7.4.5/bin/php
Reason: image not found
[1] 91168 abort php -v
解決方法
ほとんどの場合、インストールされているicu4cのバージョンが新し過ぎることが原因です。直近で brew upgrade
とかを実行した心当たりはありませんか?
というわけで、icu4cのバージョンをPHPが依存しているバージョンに戻してあげれば直ります。
今回の例だと
dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicuio.64.dylib
と言われているので、バージョン64系まで戻してあげればよいということになります。
実際、 brew info icu4c
してみると、最新の67.1が入っていました。
$ brew info icu4c
icu4c: stable 67.1 (bottled) [keg-only]
Homebrewで古いバージョンのパッケージをインストールする方法は
- Homebrewで旧バージョンのパッケージをインストールしたい - Qiita
- postgresql - Install icu4c version 63 with Homebrew - Stack Overflow
あたりが参考になります。特に今回は同じicu4cの例である後者がそのまま参考になるでしょう。
以下に具体的な手順を示します。
0. 念のためicu4cをインストールし直しておく
$ brew update && brew reinstall icu4c
1. HomebrewのFormulaディレクトリに移動
$ cd $(brew --prefix)/Homebrew/Library/Taps/homebrew/homebrew-core/Formula
2. icu4cのコミットログを調べる
$ git log --follow icu4c.rb
:
commit c78114de1252ac63590b06c1f2325e576a5d5226
Author: Pavel Omelchenko <p.Omelchenko@gmail.com>
Date: Fri Apr 3 00:58:01 2020 +0300
icu4c 66.1
commit a806a621ed3722fb580a58000fb274a2f2d86a6d
Author: Thierry Moisan <thierry.moisan@gmail.com>
Date: Wed Oct 2 13:07:31 2019 -0400
icu4c: update homepage and url (#44812)
commit 896d1018c7a4906f2c3fa1386aaf283497db60a2 ## <-- これ
Author: BrewTestBot <homebrew-test-bot@lists.sfconservancy.org>
Date: Sat Sep 28 13:49:39 2019 +0000
icu4c: update 64.2 bottle.
commit c81a048b0ebea0ba976af220806fb8ef35201e9a
Author: BrewTestBot <homebrew-test-bot@lists.sfconservancy.org>
Date: Fri Apr 19 03:35:49 2019 +0000
icu4c: update 64.2 bottle.
:
今回はバージョン64系まで戻したいので、 896d1018c7a4906f2c3fa1386aaf283497db60a2
時点のものをインストールすることにします。
3. 目的のバージョンに相当するコミットをチェックアウト
$ git checkout 896d1018c7a4906f2c3fa1386aaf283497db60a2
4. チェックアウトしたコードでパッケージをインストール
$ brew reinstall ./icu4c.rb
5. インストールし直したバージョンにスイッチ
$ brew switch icu4c 64.2
6. コードベースだけmasterに戻す
$ git checkout master
これで、無事にPHPが動作するようになりました👍
$ php -v
PHP 7.4.5 (cli) (built: Jul 14 2020 10:25:09) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.5, Copyright (c), by Zend Technologies
with Xdebug v2.9.5, Copyright (c) 2002-2020, by Derick Rethans
再発したときのための準備
brew update
したり、何かのフォーミュラを brew upgrade
したときに、一緒にicu4cのバージョンが上がってしまうことがあります。
このように割と頻繁に再発する問題なので、毎回面倒な作業をしなくて済むように一連の作業をシェルスクリプトにしておくと便利です。
ちなみに、PHP7.3以下だとicu4cのバージョン64ではなく63が必須なよう(体験談)なので、僕の場合は63と64それぞれのバージョンに戻すためのスクリプトを作ってあります。
# switch-to-icu4c63.sh
#!/bin/sh
cd $(brew --prefix)/Homebrew/Library/Taps/homebrew/homebrew-core/Formula
git checkout e7f0f10dc63b1dc1061d475f1a61d01b70ef2cb7
brew reinstall ./icu4c.rb
brew switch icu4c 63.1
git checkout master
cd -
# switch-to-icu4c64.sh
#!/bin/sh
cd $(brew --prefix)/Homebrew/Library/Taps/homebrew/homebrew-core/Formula
git checkout 896d1018c7a4906f2c3fa1386aaf283497db60a2
brew reinstall ./icu4c.rb
brew switch icu4c 64.2
git checkout master
cd -
関連ツイート
Discussion