🐘

PHPが突然Library not loaded: /path/to/libicui18n.64.dylibとか言い出したときの対処法

2020/07/16に公開

起こったこと

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で古いバージョンのパッケージをインストールする方法は

あたりが参考になります。特に今回は同じ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 -

関連ツイート

https://twitter.com/ttskch/status/1215999383704981504

https://twitter.com/ttskch/status/1215999607471128576

https://twitter.com/ttskch/status/1215999632578211840

GitHubで編集を提案

Discussion