必须添加 Ondřej Surý 的 ppa:ondrej/php PPA 源,因 Ubuntu 官方仓库严格锁定 PHP 主版本(如 22.04 仅提供 8.1),不包含 PHP 8.2,直接 apt install php8.2 会报“Unable to locate package”。

Ubuntu 系统从 PHP 7.3 升级到 PHP 8.2,不能直接用 apt upgrade 完成,因为官方源不提供跨主版本升级路径,且 Ubuntu 20.04/22.04 默认源中压根没有 PHP 8.2。必须添加可信第三方源、彻底清理旧包、安装带版本号的组件,并分别配置 CLI、Web 服务与扩展。
先确认环境并清理 PHP 7.3 残留
很多升级失败源于旧进程或配置干扰新版本加载:
- 停服务:
sudo systemctl stop php7.3-fpm nginx apache2(按你实际用的 Web 服务器选) - 禁用开机自启:
sudo systemctl disable php7.3-fpm - 杀残留进程:
sudo pkill -f "php.*fpm" - 卸载全部 PHP 7.3 相关包(含配置):
sudo apt purge php7.3\* libapache2-mod-php7.3 && sudo apt autoremove -y - 删残留目录:
sudo rm -rf /etc/php/7.3 /var/log/php7.3* /usr/lib/php/7.3
添加 Ondřej Surý PPA 并安装 PHP 8.2
这个 PPA 是 Ubuntu 用户升级 PHP 的事实标准,支持多版本共存和及时安全更新:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 装基础工具:
sudo apt install -y software-properties-common ca-certificates apt-transport-https lsb-release - 加源并更新:
sudo add-apt-repository ppa:ondrej/php -y && sudo apt update - 验证源是否生效:
apt policy php8.2→ 应显示来自ppa.launchpad.net/ondrej/php - 安装核心及常用扩展(注意:必须显式指定版本号):
sudo apt install -y php8.2 php8.2-cli php8.2-fpm php8.2-mysql php8.2-mbstring php8.2-xml php8.2-zip php8.2-opcache php8.2-bcmath php8.2-curl php8.2-gd php8.2-intl
分场景配置 Web 服务与默认 CLI 版本
CLI、Apache、Nginx 三者互不自动关联,需各自设置:
立即学习“PHP免费学习笔记(深入)”;
-
CLI 默认版本:运行
sudo update-alternatives --install /usr/bin/php php /usr/bin/php8.2 82,再执行sudo update-alternatives --config php选择 82 -
Apache 用户:执行
sudo a2dismod php7.3(如有),再sudo a2enmod php8.2,最后sudo systemctl restart apache2 -
Nginx 用户:检查站点配置中
fastcgi_pass是否为unix:/run/php/php8.2-fpm.sock;确认/etc/php/8.2/fpm/pool.d/www.conf中listen.owner = www-data且listen.group = www-data;然后sudo systemctl enable --now php8.2-fpm nginx
验证是否真正生效
只看 php -v 不够,要分层确认:
- 终端命令:
php -v和which php都应指向 8.2.x - FPM 状态:
sudo systemctl status php8.2-fpm显示 active (running) - 扩展加载:
php -m | grep -E "(mysql|curl|gd|mbstring)"应有输出 - Web 层验证:建一个
info.php文件,内容为<?php phpinfo(); ?>,浏览器访问,确认版本、Loaded Configuration File 路径为/etc/php/8.2/...,且扩展列表完整 - 安全项检查:
php --ini | grep "Loaded"后打开对应php.ini,确认expose_php = Off、display_errors = Off仍启用


















