Mac上清理旧PHP需四路并进:先用which php、php -v、php --ini、brew list | grep php确认来源;Homebrew安装的执行brew uninstall --force php@x.x并cleanup;MAMP需删应用及~/.zshrc中PATH引用;最后杀进程、删socket、查Web配置确保彻底清除。

Mac上清理旧PHP再重装,关键不是“删得快”,而是“断得清”——PATH、配置文件、socket、Web服务四路并进,漏掉任何一路都会导致php -v显示旧版本、Nginx 502、或which php指向诡异路径。
先查清楚PHP到底从哪来
别急着删。四条命令必须挨个跑完,看清楚输出再动:
- which php → 返回 /opt/homebrew/bin/php 是 Homebrew;返回 /Applications/MAMP/bin/php/php8.3.12/bin/php 就是 MAMP;返回 /usr/bin/php 是系统残留(macOS Monterey 及更早)
- php -v → 记下实际运行的版本号,比如 PHP 8.2.10
- php --ini → 重点看 Loaded Configuration File 路径,它直接暴露配置归属(/opt/homebrew/etc/php/8.2/php.ini = brew;/Applications/MAMP/conf/php8.3.12/php.ini = MAMP)
- brew list | grep php@ → 有输出(如 php@8.2)说明 brew 管着它;无输出 ≠ 没装,可能来自手动或 MAMP
Homebrew PHP:精准卸载+防残留
Homebrew 的 PHP 全是带版本号的 formula(如 php@8.2),不存在叫 php 的包名,brew uninstall php 必然失败。必须按实际版本操作:
- 列出所有: brew list | grep "php@"
- 强制卸载(多个空格隔开): brew uninstall --force php@8.2 php@8.3
- 清理缓存与孤儿依赖: brew cleanup && brew autoremove
- 验证是否干净: which php 应无输出;php -v 应报 command not found
- ⚠️ 容易踩的坑:只卸一个版本(比如只卸 php@8.3 却漏了 php@8.2),which php 仍能命中,你以为清完了,其实没
MAMP 或手动安装的 PHP:删目录+砍 PATH 引用
MAMP 不走 brew,它的 PHP 完全独立,删应用不等于删环境变量:
- 彻底删除应用: sudo rm -rf /Applications/MAMP
- 检查 shell 配置文件(~/.zshrc、~/.zprofile 或 ~/.bash_profile)中是否有类似 export PATH="/Applications/MAMP/bin/php/php8.3.12/bin:$PATH" 的行,整行删掉
- 执行 source ~/.zshrc(或对应文件)让改动生效
- 杀掉残留进程:sudo pkill -f php-fpm
- 删除 Unix socket(常见于 /usr/local/var/run/php-fpm.sock 或 /opt/homebrew/var/run/php-fpm.sock),否则新装的 php-fpm 启动会报 Address already in use
Nginx/Apache 配置里藏着“幽灵PHP”
Web 服务器配置若还指向旧 PHP-FPM socket 或二进制路径,重启后照样 502:
- 检查 Nginx 配置中的 fastcgi_pass:
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000; # 或 unix:/usr/local/var/run/php-fpm.sock
}
如果你改用 brew 新装的 php@8.5,它的默认 socket 路径是 /opt/homebrew/var/run/php-fpm.sock(Apple Silicon)或 /usr/local/var/run/php-fpm.sock(Intel),必须同步改配置
- 检查 Apache 的 LoadModule php_module 和 PHPIniDir 指向,旧路径如 /Applications/MAMP/bin/php/php8.3.12/modules/libphp.so 必须清除
- 修改后务必运行 sudo nginx -t 或 sudo apachectl configtest 验证语法,再 sudo nginx -s reload 或 sudo apachectl restart
最常被忽略的是 Web 服务器配置里的 socket 路径和 php --ini 显示的配置文件位置——它们不像命令行 PATH 那样容易被 which 暴露,但一旦错位,502 报错就甩不掉。



















