Mac の Homebrew で入れた PHP8.0 が使えなくなったので対処してみた
最近、PHP8.3 にアップデートしたら、突然 PHP8.0 が使えなくなったんです。どうやら、icu4c が 74 に依存するようになってしまい、PHP8.0 では icu4c のバージョンが 73 じゃないとダメみたい。なので、ちょっとした対処方法をシェアします!
エラーの発生
まず、ターミナルで php -v
コマンドを叩いたらこんなエラーが出ました。
$ php -v
dyld[660]: Library not loaded: /opt/homebrew/opt/icu4c/lib/libicuio.73.dylib
Referenced from: <139D175A-03FF-30B0-926E-B3B5282021FF> /opt/homebrew/Cellar/php@8.0/8.0.30_1/bin/php
Reason: tried: '/opt/homebrew/opt/icu4c/lib/libicuio.73.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/opt/homebrew/opt/icu4c/lib/libicuio.73.dylib' (no such file), '/opt/homebrew/Cellar/icu4c/74.2/lib/libicuio.73.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/opt/homebrew/Cellar/icu4c/74.2/lib/libicuio.73.dylib' (no such file), '/opt/homebrew/Cellar/icu4c/74.2/lib/libicuio.73.dylib' (no such file)
おいおい、icu4c のバージョン違いで動かないとか勘弁してよ…。
解決策
この記事を参考にして【Qiita】、以下の手順で対処しました。
この記事をそのまま解決した人は本家を参照してもらえたらと思います。
私は少しアレンジが必要だったのでこの記事を残しています。
1. icu4c@73 をインストール
まずは icu4c のバージョン 73 をインストールします。
$ brew tap-new icu4c/taps
$ brew tap homebrew/core --force
$ brew extract icu4c icu4c/taps --version 73
$ brew install icu4c/taps/icu4c@73
どうやら参考記事に加え、このコマンドが必要だったようです。
$ brew tap homebrew/core --force
2. icu4c@73 を既存の icu4c の lib に Symlink を設置
次に、icu4c@73 のライブラリを現在の icu4c のディレクトリに Symlink します。
$ for f in $BREWPATH/opt/icu4c@73/lib/*73.dylib; do ln -s $BREWPATH/opt/icu4c@73/lib/${f##*/} $BREWPATH/opt/icu4c/lib/${f##*/}; done
最新のPHP(8.3)も利用したいので最新のicu4cとicu4c@73が共存できるようにしています。
3. PHP8.0 が無事復活!
再度、php -v
を確認したら無事に PHP8.0 が動作するようになりました!
$ php -v
PHP 8.0.30 (cli) (built: Aug 3 2023 17:13:08) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.30, Copyright (c) Zend Technologies
with Zend OPcache v8.0.30, Copyright (c), by Zend Technologies
4. 最新のPHPも無事に動作
もちろん、最新の PHP8.3 も問題なく動きます!Symlink の切り替えを忘れずにね。
$ php -v
PHP 8.3.10 (cli) (built: Jul 30 2024 13:44:37) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.10, Copyright (c) Zend Technologies
with Zend OPcache v8.3.10, Copyright (c), by Zend Technologies
これで完了!困ったときは試してみてくださいね。