PHP 升级失败主因是源配置与运行时共存逻辑未处理:Ubuntu/Debian 需添加 PPA、安装指定版本扩展、用 update-alternatives 切换默认命令;macOS 须修正 PATH 和 Apache 模块路径;CentOS/RHEL 需启用 EPEL+Remi 源并启用对应 module;Web 服务需确认 php.ini 路径、重启对应 FPM 服务并同步扩展配置。

PHP 版本过低(比如 7.2 或更早)时,直接用包管理器(如 apt、brew、dnf)升级到 8.1+ 往往失败——默认源不提供新版,硬装还可能破坏系统依赖。这不是“命令没输对”,而是源配置和运行时共存逻辑没处理好。
Ubuntu/Debian 上 apt 升级 PHP 到 8.2 的关键三步
官方仓库的 apt 默认只带 PHP 7.4(Ubuntu 20.04)或 8.1(22.04),要装 8.2/8.3 必须换源:
- 添加 Ondřej Surý 的 PPA:
sudo add-apt-repository ppa:ondrej/php,然后sudo apt update - 安装指定版本(例如 PHP 8.2):
sudo apt install php8.2 php8.2-cli php8.2-mysql php8.2-curl—— 注意别只装php8.2,CLI 和扩展得手动列全 - 切换默认
php命令指向:sudo update-alternatives --config php,选中 8.2 对应编号;否则php -v仍显示旧版
漏掉第三步是最多人卡住的地方:包装好了,但 php 命令还是老版本。
macOS 用 brew 升级 PHP 容易踩的两个坑
brew install php 默认装最新稳定版(目前是 8.3),但实际运行时可能不生效:
立即学习“PHP免费学习笔记(深入)”;
- PATH 优先级问题:
which php返回的仍是/usr/bin/php(系统自带 8.1)?执行brew unlink php && brew link --force php强制重链 - Apache 不识别新 PHP:macOS 自带 Apache 不会自动加载 brew 装的
libphp.so,必须手动改/etc/apache2/httpd.conf,注释掉原LoadModule php_module行,加上 brew 的路径,例如:LoadModule php_module /opt/homebrew/lib/httpd/modules/libphp.so
不改 Apache 配置,phpinfo() 页面里版本永远不变。
CentOS/RHEL 8+ 用 dnf 启用 EPEL + Remi 源
CentOS Stream 8/9 或 RHEL 8+ 自带的 dnf 源里 PHP 最高只到 8.0,必须启用第三方仓库:
- 先启用 EPEL:
sudo dnf install epel-release - 再启用 Remi(推荐):
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm(RHEL 8 对应链接) - 启用 PHP 8.2 模块:
sudo dnf module reset php && sudo dnf module enable php:remi-8.2,再sudo dnf install php php-cli php-mysqlnd
dnf module enable 这步不能跳,否则 dnf install php 仍拉取系统默认的 8.0。
升级后 Web 服务不生效?检查模块与 ini 文件位置
PHP CLI 版本更新了,但 Nginx/Apache 用的不是同一个 php.ini,扩展加载路径也可能不同:
- 查 Web 用的配置文件:
phpinfo()页面里看 “Loaded Configuration File” 路径,通常不是/etc/php/8.2/cli/php.ini,而是/etc/php/8.2/apache2/php.ini或/etc/php/8.2/fpm/php.ini - FPM 用户注意:
sudo systemctl restart php8.2-fpm(不是php-fpm),服务名含具体版本号 - 扩展是否启用:CLI 下
php -m | grep curl有,但 Web 里没有?说明extension=curl只写在 CLI 的php.ini里,需同步到 FPM 或 Apache 对应配置中
最常被忽略的是:以为升级完就万事大吉,结果 Web 请求仍走旧进程、读旧配置、报 Function not found 错误。











