mac系统需实现php多版本共存与快速切换:用homebrew安装php@8.0/8.1/8.2等独立版本,通过brew unlink + brew link –force切换全局默认版本,或用path优先级、项目级脚本实现per-project精准控制。

mac 系统默认带的 PHP 版本老旧(如 7.3 或 8.1),且无法用 brew install php 直接覆盖系统版本——你真正需要的不是“安装”,而是「多版本共存 + 快速切换」。
用 Homebrew 安装多个 PHP 版本(不冲突)
Homebrew 默认只保留最新稳定版,但你可以手动拉取旧版本公式并安装:
- 先确保已启用
homebrew-versions(新版 Brew 已整合,直接用brew install php@8.0、brew install php@8.1、brew install php@8.2即可) - 每个版本会安装到独立路径,例如:
/opt/homebrew/opt/php@8.1/bin/php(Apple Silicon)或/usr/local/opt/php@8.1/bin/php(Intel) - 不要运行
brew link php@8.1—— 这会强行覆盖php命令软链,导致全局冲突
用 brew unlink + brew link 切换当前 shell 的默认 PHP
这是最轻量、无需额外工具的切换方式,适合项目级临时切换:
- 先断开所有已链接的 PHP:
brew unlink php(如果之前 link 过) - 再链接目标版本:
brew link --force php@8.2 - 验证:
which php应返回/opt/homebrew/bin/php,php -v显示 8.2.x - 注意:
--force是必须的,否则 Brew 会拒绝覆盖已存在的 bin 链接
用 alias 或 PATH 优先级实现 per-project 切换
如果你在不同项目里要固定用不同 PHP 版本(比如 laravel 10 要 8.1,新项目用 8.3),硬切全局不现实:
立即学习“PHP免费学习笔记(深入)”;
- 在项目根目录的
.zshrc或.zprofile中加一行:export PATH="/opt/homebrew/opt/php@8.1/bin:$PATH" - 或者更干净的做法:在项目中写个
php脚本(chmod +x),内容为#!/bin/sh exec /opt/homebrew/opt/php@8.1/bin/php "$@",然后export PATH="./bin:$PATH" - 避免把
phpalias 写进全局 shell 配置——它会在所有终端生效,容易误伤其他项目
别碰 sudo port 或手动编译,除非你明确知道为什么
MacPorts、macos 自带 apache+PHP、以及源码编译的 PHP,三者和 Homebrew PHP 的 ext 路径、php.ini 位置、openssl 依赖完全不兼容:
- 执行
php -i | grep "Loaded Configuration File",确认你改的是当前生效的php.ini(通常在/opt/homebrew/etc/php/8.2/php.ini) - 扩展如
pdo_mysql在不同 PHP 版本下必须重新编译或用对应版本的pecl install,不能复用 - 一旦混用,常见报错是:
PHP Warning: PHP Startup: Unable to load dynamic library 'pdo_mysql'
真正麻烦的不是装几个版本,而是扩展、INI 配置、CLI 与 Web Server(如 Valet、Laravel Sail、内置 Apache)使用的 PHP 是否一致——每次切换后,务必检查 php -m 和 phpinfo() 输出是否匹配。