Mac上配置PHP多版本环境的核心是通过brew link控制CLI默认版本、PATH确保路径优先级,并为Apache/Nginx单独配置对应PHP-FPM的模块或socket路径,且需分别重启服务;老版本需先brew tap shivammathur/php再安装,php --ini可验证实际加载的php.ini路径。

Mac上配置PHP多版本环境,核心不是“装多个”,而是“让系统知道该用哪个”——brew link 和 PATH 顺序共同决定命令行默认版本,而Web服务器(Apache/Nginx)需单独绑定对应版本的PHP-FPM进程。跳过这层理解,直接改配置只会导致CLI和Web显示不同版本。
安装多个PHP版本前先加tap
Homebrew官方仓库只提供最新稳定版(如php@8.3),老版本(7.4、8.0、8.1等)需从第三方源获取。不加tap就搜不到、装不了。
- 运行
brew tap shivammathur/php启用扩展仓库 - 执行
brew search php@确认能列出php@7.4、php@8.1、php@8.3等条目 - 逐个安装:
brew install php@7.4、brew install php@8.1、brew install php@8.3 - 注意:每个版本安装后默认不会自动
link,也不会覆盖已有链接
切换命令行默认PHP版本的关键动作
仅靠export PATH把某个版本路径加到最前,不一定生效——Homebrew会优先使用brew link指向的版本,它会硬覆盖PATH逻辑。
- 先解除当前链接:
brew unlink php(如果已link过) - 再强制链接目标版本:
brew link --force --overwrite php@8.1 - 验证:
php -v应输出8.1.x;which php应返回/opt/homebrew/bin/php(Apple Silicon)或类似路径 - 如果仍不生效,检查
~/.zshrc里有没有残留的alias php=...或错误PATH拼接
Apache或Nginx调用PHP时版本不一致?查fpm socket路径
Web服务器不读PATH,也不管brew link,它只认你配置里写的fastcgi_pass或LoadModule路径。CLI是8.3,网页却显示7.4,大概率是这里没配对。
立即学习“PHP免费学习笔记(深入)”;
- Apache + mod_php:确认
httpd.conf中LoadModule php_module指向的是目标版本的libphp.so,例如/opt/homebrew/opt/php@8.1/lib/httpd/modules/libphp.so - Nginx + PHP-FPM:确认
nginx.conf里fastcgi_pass对应的socket文件路径,例如unix:/opt/homebrew/var/run/php-fpm-8.1.sock - 启动对应FPM服务:
brew services start php@8.1,而不是php(后者默认启最新版) - 别忘了重启Web服务:
brew services restart nginx或sudo apachectl restart
Composer依赖报错或找不到扩展?检查php.ini加载路径
Composer和PHP脚本运行时读的是当前PHP二进制绑定的php.ini,不是你编辑过的那个。版本切了,ini路径也跟着变。
- 运行
php --ini查看实际加载的配置文件路径,例如:Loaded Configuration File: /opt/homebrew/etc/php/8.1/php.ini - 确保该
php.ini中启用所需扩展,如extension=mbstring、extension=pdo_mysql - 若用
php@7.4,它的php.ini在/opt/homebrew/etc/php/7.4/php.ini,不是8.1的 - 修改后必须重启PHP-FPM:
brew services restart php@7.4,否则扩展不生效
最容易被忽略的一点:Web服务器和CLI使用不同PHP进程,意味着它们各自独立加载php.ini、各自运行独立的FPM实例。改完命令行PATH,不碰Nginx配置,网页永远用不上新版本;反之亦然。版本管理不是“设一次就全局生效”,而是每个执行上下文都要单独对齐。



















