PHP版本升级需重装而非仅重启,CLI与Web环境可能使用不同版本,须分别验证;Ubuntu推荐用ondrej PPA安装多版本并正确切换FPM/Apache模块或Nginx fastcgi_pass配置。

PHP 版本过低通常不是靠“重启服务”就能升级的,升级 PHP 本身需要重新安装或更新二进制,而重启只是让新版本生效的最后一步——但前提是 PHP 已被正确替换或切换。直接重启 php-fpm 或 apache2 不会改变 PHP 主版本号。
确认当前 PHP 实际运行版本和入口
很多用户看到 php -v 显示新版,但网页里 phpinfo() 仍是旧版,说明 CLI 和 Web SAPI(如 FPM 或 Apache 模块)用的是不同安装路径。
- 查 CLI 版本:
php -v - 查 Web 环境实际版本:在 Web 目录放一个
info.php,内容为,通过浏览器访问 - 查 Web 使用的 SAPI:
php -i | grep "Server API"(常见值是fpm-fcgi或apache2handler) - 查正在运行的 PHP 进程路径:
ps aux | grep php,重点关注php-fpm的二进制位置(如/usr/bin/php-fpm8.2)或 Apache 加载的模块路径(如/usr/lib/apache2/modules/libphp8.1.so)
Ubuntu/Debian 上用 ondrej PPA 升级 PHP(推荐)
官方源 PHP 版本老旧,ondrej/php 是最稳妥的第三方源,支持多版本共存和干净切换。
- 添加源:
sudo apt install -y software-properties-common && sudo add-apt-repository ppa:ondrej/php && sudo apt update - 安装目标版本(如 8.2):
sudo apt install php8.2 php8.2-fpm php8.2-mysql php8.2-curl(按需加扩展) - 禁用旧版 FPM:
sudo systemctl disable php8.1-fpm(假设旧版是 8.1) - 启用新版 FPM:
sudo systemctl enable php8.2-fpm && sudo systemctl start php8.2-fpm - 如果是 Apache,还需切换模块:
sudo a2dismod php8.1 && sudo a2enmod php8.2 && sudo systemctl restart apache2
Nginx + PHP-FPM 场景下必须检查 fastcgi_pass 配置
Nginx 不直接调用 PHP,而是通过 fastcgi_pass 转发给 php-fpm。升级 PHP 后若没改这一项,Nginx 仍连着旧版 FPM socket。
立即学习“PHP免费学习笔记(深入)”;
- 检查站点配置中
fastcgi_pass指向:fastcgi_pass unix:/run/php/php8.1-fpm.sock→ 应改为php8.2-fpm.sock - 确认 socket 文件存在:
ls /run/php/ | grep fpm - 重载 Nginx:
sudo nginx -t && sudo systemctl reload nginx(不是 restart) - 别漏掉
php-fpm自身配置文件里的listen路径是否匹配(默认一般一致)
重启顺序和验证要点
顺序错会导致服务中断或版本不生效。关键是先确保新 PHP 进程已就绪,再通知 Web 服务器连接它。
- 先启动新
php-fpm:sudo systemctl start php8.2-fpm(验证systemctl status php8.2-fpm是 active) - 再重载 Web 服务:
sudo systemctl reload nginx或sudo systemctl restart apache2 - 验证不能只看
php -v,必须用浏览器打开info.php确认PHP Version和Loaded Configuration File都指向新版 - 注意扩展兼容性:PHP 8.2 可能不兼容某些旧扩展(如
mcrypt已移除),报错会出现在php-fpm日志(/var/log/php8.2-fpm.log)
最常被忽略的是 Web 服务器配置里硬编码的 PHP 版本路径或 socket 名,以及扩展未同步安装导致 php-fpm 启动失败却没被注意到——建议升级后第一件事是查 journalctl -u php8.2-fpm -n 50 --no-pager。











