因为维护多个新老项目,对于 PHP 多版本有需要。所以按照 Mac 下使用 brew 安装 php7 版本并切换 分别安装了 php71、php80、php81,还有默认的 php(php82)。

最近需要使用到 laravel artisan 指令生成任务类,php71 artisan make:job xxx,发现 php71 执行报错了,然后试了其他的几个版本,除了最新的 php(php82) 以外,都没有意外的报错了:

> php80 -v
dyld[15905]: Library not loaded: /usr/local/opt/icu4c/lib/libicuio.72.dylib
  Referenced from: <00E08E9A-3803-3831-BC94-616E67D40C5F> /usr/local/Cellar/php@8.0/8.0.28/bin/php
  Reason: tried: '/usr/local/opt/icu4c/lib/libicuio.72.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/usr/local/opt/icu4c/lib/libicuio.72.dylib' (no such file), '/usr/local/opt/icu4c/lib/libicuio.72.dylib' (no such file), '/usr/local/lib/libicuio.72.dylib' (no such file), '/usr/lib/libicuio.72.dylib' (no such file, not in dyld cache), '/usr/local/Cellar/icu4c/73.2/lib/libicuio.72.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/usr/local/Cellar/icu4c/73.2/lib/libicuio.72.dylib' (no such file), '/usr/local/Cellar/icu4c/73.2/lib/libicuio.72.dylib' (no such file), '/usr/local/lib/libicuio.72.dylib' (no such file), '/usr/lib/libicuio.72.dylib' (no such file, not in dyld cache)

根据描述搜索到一篇问答:dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.62.dylib error running php after installing node with brew on Mac,情况基本一致。

其中高赞回答的一和二对问题解决都有帮助,回答一里是更新 icu4c 或者更新所有的 brew 包。因为二级评论里提到一般不需要更新所有的 brew 包,就先尝试 回答二里的方法。

回答二:

brew info icu4c
brew switch icu4c <version>

这里执行的时候有问题:Error: Unknown command: switch。没办法,只好再去尝试回答一。

回答一

注意 - 这会更新所有你安装的 brew 包, 包括但不限于 PHP。 如果你只想更新特定的包,那么就需要指定包名
brew upgrade icu4c

brew upgrade // 或者执行这个更新所有的包

# 最后,执行清理
brew cleanup

一开始想只更新 icu4c,但收到提示包已安装。这样的话,只能更新所有的包了。执行完后,php 指令返回都正常了。