因为Homebrew安装php@X.Y后不会自动link,php命令未加入PATH,系统仍调用/usr/bin/php;需执行brew unlink php && brew link --force php@X.Y,并验证which php和php -v。

brew install php@X.Y 后为什么 php -v 还是旧版本
因为 Homebrew 不会自动 link 任何 PHP 版本——安装只是把二进制和配置放到 /opt/homebrew/opt/php@8.2 这类路径下,php 命令根本没出现在 $PATH 里。你看到的“旧版本”大概率是系统自带的 /usr/bin/php(macOS 14+ 已移除,但老系统或残留 alias 仍可能干扰)。
验证方式:运行 which php。如果返回 /usr/bin/php 或报错 command not found,说明还没 link 成功。
- 先执行
brew unlink php(如果之前 link 过其他版本) - 再执行
brew link --force php@8.2(--force必须加,否则可能因冲突失败) - 新开终端或运行
hash -r清除 shell 命令缓存 - 确认
which php返回/opt/homebrew/bin/php,且php -v显示目标版本
切换 CLI 版本后 Web 服务(Nginx + PHP-FPM)不生效
CLI 和 Web 是两套完全独立的进程:你改了 php 命令,PHP-FPM 进程仍按旧配置在跑,Nginx 也照连旧 socket。这是最常被忽略的环节。
必须手动同步:
立即学习“PHP免费学习笔记(深入)”;
- 停止当前 PHP-FPM:
brew services stop php@8.1 - 启动目标版本:
brew services start php@8.2 - 检查 Nginx 配置中
fastcgi_pass是否指向正确地址,例如127.0.0.1:9002(php@8.2 默认端口)或unix:/opt/homebrew/var/run/php-fpm.sock - 重启 Nginx:
brew services restart nginx或sudo nginx -s reload - 用
ps aux | grep php-fpm确认进程路径含php@8.2
项目级隔离:为什么不用 export PATH 改全局环境变量
在 ~/.zshrc 里写 export PATH="/opt/homebrew/opt/php@8.1/bin:$PATH" 看似简单,实则埋雷:所有终端、IDE、脚本、Git hooks 全部强制走这个版本,一旦切错或忘记 source,CI/本地测试行为不一致,debug 成倍耗时。
更稳的做法是项目内显式调用:
- 在项目根目录建
bin/php,内容为:#!/bin/sh exec /opt/homebrew/opt/php@8.1/bin/php "$@"
chmod +x bin/php- 后续命令统一用
./bin/php -v、./bin/php composer.phar install - IDE(如 PHPStorm)可直接指定 CLI 解释器路径为
your-project/bin/php,彻底解耦全局状态
php@7.4 安装失败或无法 link 的真实原因
Homebrew 已于 2024 年底正式归档(archive)php@7.4:它不再提供预编译二进制,也不再接受安全更新。尝试 brew install php@7.4 会直接报错 Error: No available formula with the name "php@7.4"。
这不是你的网络或配置问题,而是官方策略。应对方式只有两个:
- 升级代码:用
php -l+phpstan+ 官方迁移指南逐步适配 8.0+,这是长期成本最低的方案 - 临时兜底:用
phpbrew编译安装(需 Xcode command line tools),或起一个轻量 Docker 容器(docker run --rm -v $(pwd):/app -w /app php:7.4-cli php -v)
硬要走 Homebrew 老路,只会卡在 OpenSSL 版本冲突、libxml2 编译失败、或装完无法 link —— 这些都不是配置问题,是生态已放弃支持。



















