如何卸载旧版本PHP_为安装新版本做好环境准备【指南】

1次阅读

必须先确认php安装方式再卸载:通过dpkg/rpm/brew/which+php–ini判断来源;系统包管理器用purge/remove+autoremove,homebrew用unlink+uninstall,源码安装优先make uninstall或手动清理;卸载后需清配置、验证path、进程、web服务器配置及扩展残留。

如何卸载旧版本PHP_为安装新版本做好环境准备【指南】

确认当前 PHP 版本和安装方式

直接运行 php -v 只能告诉你版本号,但卸载前必须知道它是怎么装的——源码编译、系统包管理器(apt/yum/dnf)、或第三方仓库(如 Ondřej Surý 的 PPA、Remi、Homebrew)。不同来源的卸载方式完全不同,混用会导致残留或冲突。

查安装来源的方法:

  • debian/ubuntudpkg -l | grep phpapt list --installed | grep php
  • RHEL/centos/Fedora:rpm -qa | grep php
  • macOS(Homebrew):brew list | grep php
  • 源码编译安装(常见于 /usr/local/bin/php):which php + php --ini 看配置路径,再检查 make uninstall 是否可用(多数情况不可用)

用系统包管理器彻底卸载(推荐优先走这条路)

如果 PHP 是通过 aptyumdnf 安装的,别手动删文件。否则会留下配置、模块、服务单元等碎片,后续新版本可能因旧配置报错(比如 PHP Warning: Module 'xxx' already loaded)。

操作要点:

立即学习PHP免费学习笔记(深入)”;

  • Ubuntu/Debian:sudo apt purge $(dpkg -l | grep '^ii.*php' | awk '{print $2}') && sudo apt autoremove(注意加 purge,不是 remove
  • CentOS 7:sudo yum remove php* && sudo yum autoremove
  • Fedora:sudo dnf remove php* && sudo dnf autoremove
  • 卸载后务必清空配置残留:sudo rm -rf /etc/php* /var/lib/php*(某些发行版不会自动删这些)

Homebrew 或源码安装的清理要点

Homebrew 和源码安装不走系统包管理器,卸载逻辑不同。尤其 Homebrew,直接 rm -rf 会破坏 brew 的数据库,导致后续 brew doctor 报错。

正确做法:

  • Homebrew:brew unlink php@8.1(换成你实际安装的版本),再 brew uninstall php@8.1;若装了多个版本,逐个执行,别用通配符
  • 源码安装:如果你还留着原编译目录,且当时执行过 make install,可尝试 sudo make uninstall(但很多 configure 脚本不支持该目标);更稳妥的是手动删:sudo rm -f /usr/local/bin/php* /usr/local/lib/php* /usr/local/etc/php*,然后检查 echo $PATH 是否仍含 /usr/local/bin,必要时临时从 shell 配置中注释掉
  • 无论哪种方式,都要检查 php --ini 输出的配置文件路径是否还存在,以及 ls -la $(which php) 确认二进制文件已被移除

卸载后验证与环境重置

卸载完成不等于环境干净。常见陷阱是 PATH 缓存、shell 别名、或旧的 php-fpm 服务仍在运行,导致你以为卸载成功,其实只是新命令没生效。

关键验证步骤:

  • 新开终端或运行 hash -r(清除 shell 命令缓存),再输 php -v —— 应报 command not found
  • 检查进程:ps aux | grep php,确保没有残留的 php-fpmhttpd 加载旧模块
  • apache/nginx 用户:确认 LoadModule php_modulefastcgi_pass 指向的不是旧 libphp.so 或 socket 路径
  • 最后一步再装新版前,建议运行 which phpphp --iniphp -m 三连查,确认无输出或报错

最易被忽略的是旧扩展的 .so 文件残留在 /usr/lib/php/*//usr/local/lib/php/extensions/ 下,新版本启动时可能因 ABI 不兼容直接 segfault。动手前先备份再删,比重装系统快。

text=ZqhQzanResources