php升级需先确认来源,再通过shivammathur/php tap安装指定版本(如php@8.3),手动link并配置path、web服务器及扩展,最后四点交叉验证生效。

PHP版本过低时,用Homebrew升级不是简单执行 brew upgrade php 就能搞定——因为官方 homebrew/php 早在2019年就已弃用,现在所有PHP公式(如 php@8.1、php@8.3)都托管在第三方 tap 中,直接运行 brew upgrade php 很可能报错“no available formula”,或升级失败后 php -v 仍显示旧版本。
确认当前PHP来源和版本
很多人卡在第一步:根本不知道自己用的是哪个PHP。系统自带的 /usr/bin/php(macOS 12+ 已移除)、Homebrew 安装的、MAMP 内置的、甚至 Valet 管理的 PHP,路径和控制逻辑完全不同。
- 运行
which php看命令指向哪——如果是/usr/bin/php,说明你还在用系统残留或未生效的旧版本 - 运行
php -v和brew list | grep php对照:如果后者没输出,代表 Homebrew 根本没装过 PHP - 运行
brew --prefix php@8.3(替换为你想装的版本)看是否返回路径;若报错“no formula”,说明该版本尚未添加源
添加正确tap并安装目标版本
Homebrew 默认不提供 PHP 公式,必须手动接入维护活跃的第三方仓库。目前最稳定、更新及时的是 shivammathur/php(截至2026年仍在持续发布 PHP 8.3/8.4 nightly 支持)。
- 先执行
brew update确保 Homebrew 索引最新 - 再运行
brew tap shivammathur/php——这步不能跳,否则brew install php@8.3会失败 - 安装指定版本:
brew install shivammathur/php/php@8.3(注意完整命名,含shivammathur/php/前缀) - 安装后默认不会自动链接,需手动
brew link --force php@8.3(--force是关键,否则可能提示“already linked”但实际未生效)
PATH 和 Web 服务器双轨生效
只改 PATH 让 CLI 生效,不代表 Apache/Nginx 或 Valet 就用了新 PHP——它们各自加载模块的路径是硬编码的,必须单独配置。
立即学习“PHP免费学习笔记(深入)”;
- CLI 生效:编辑
~/.zshrc(或~/.bash_profile),加一行export PATH="$(brew --prefix php@8.3)/bin:$PATH",然后source ~/.zshrc - Apache 生效:打开
/etc/apache2/httpd.conf,找到LoadModule php_module行,改为LoadModule php_module /opt/homebrew/opt/php@8.3/lib/httpd/modules/libphp.so(路径以brew --prefix php@8.3输出为准) - Nginx + PHP-FPM:启动新版本的 FPM:
brew services start php@8.3,并检查php-fpm.conf中error_log是否指向新版本日志路径 - Valet 用户额外注意:
valet use php@8.3(不是valet install)才能切换底层 PHP,否则仍走旧版
扩展和配置迁移常被忽略
新装的 php@8.3 自带干净的 php.ini,但你的项目依赖的扩展(如 redis、imagick)并不会自动复制过去,且 PECL 扩展必须与当前 PHP 的 ABI 版本严格匹配。
- 不要复用旧版
extension_dir路径;新版本的扩展目录在$(brew --prefix php@8.3)/lib/php/pecl下 - 重装扩展必须指定对应版本:
pecl install -f redis(-f强制覆盖,避免版本冲突) - 检查是否加载成功:
php -m | grep redis,同时验证 ini 文件是否启用:php --ini查看Loaded Configuration File路径,再确认该文件里有extension=redis.so - 如果
phpinfo()页面中显示模块但 CLI 不显示,大概率是 CLI 和 Web 使用了不同php.ini——分别查php -i | grep "Configuration File"和网页里的phpinfo()输出对比
最易出问题的环节不是安装,而是「以为装完了」——比如 php -v 显示新版,但 Apache 还在跑 7.4,或者 composer install 报 mbstring 缺失,其实只是扩展没装到新 PHP 目录下。每次切换后,务必用 which php、php -m、php --ini 和网页 phpinfo() 四点交叉验证。











