比如,从 8.3.32 升级到 8.3.36 是一次小版本内的安全更新,核心目标是修复 CVE-2026-109618 和 CVE-2026-109619 两个严重的远程代码执行漏洞。具体操作方式取决于你当初是如何在 Debian 12 上安装 PHP 8.3 的。
⚠️ 升级前:确认安全背景与做好备份
本次升级并非功能性更新,而是一次紧急安全补丁。在操作前,请务必:
-
备份关键数据:至少备份
/etc/php/下的所有配置、网站数据和数据库。 -
记录当前状态:执行
php -v和php -m,记录下当前的版本和已加载的扩展列表,以便升级后对比。
📦 场景一:通过 SURY (deb.sury.org) 仓库安装(最常见)
如果你当初是按照主流教程,通过 Ondřej Surý 的仓库安装的 PHP 8.3,那么升级过程非常直接。
步骤 1:更新软件包列表并执行升级
sudo apt update sudo apt install --only-upgrade $(dpkg -l 'php*' | awk '/^ii/{print $2}')
这条命令会精准地只升级系统上已安装的所有 PHP 相关包,不会额外安装新包或更改包名。
步骤 2:重启 PHP-FPM 和 Web 服务
升级软件包后,必须重启服务才能让新的二进制文件生效。
# 重启 PHP-FPM (请根据你实际的版本号调整,通常是 8.3) sudo systemctl restart php8.3-fpm.service # 如果你使用 Apache 的 mod_php,则重启 Apache # sudo systemctl restart apache2 # 如果你使用 Nginx,通常无需重启 Nginx,只需确保 PHP-FPM 已重启
关于包名陷阱的说明:--only-upgrade 方法能有效避免手动替换包名时可能出现的错误(例如,忘记将 php8.3-mysql 替换为对应新版本的包名)。
🔧 场景二:从源码编译安装
如果你的 PHP 8.3 是自行编译的,则需要重新下载 8.3.36 的源码并进行编译安装。
步骤 1:下载新版本源码
从 PHP 官方历史版本归档中获取 8.3.36 的源码包。
wget https://www.php.net/distributions/php-8.3.36.tar.gz tar -xzf php-8.3.36.tar.gz cd php-8.3.36
步骤 2:使用与之前相同的配置参数编译
关键:你必须使用与上次编译时完全相同的 ./configure 参数,否则可能导致扩展不兼容或功能缺失。如果你保留了之前的编译脚本或笔记,请直接复用。如果不确定,可以尝试通过 php -i | grep "Configure Command" 来查找。
./configure [你的原始编译参数...] make -j$(nproc) sudo make install
步骤 3:重启服务
编译安装完成后,同样需要重启 PHP-FPM 或 Apache 服务。
✅ 验证升级结果
升级完成后,请通过以下方式确认版本已更新且修复已生效:
1. 检查 CLI 和 FPM 版本
php -v # 输出应显示 PHP 8.3.36 # 检查 FPM 的版本(如果使用) /usr/sbin/php-fpm8.3 -v
2. 验证安全补丁已应用
版本号正确不一定代表安全补丁已应用(有时发行版会回移补丁但不改版本号)。对于 SURY 仓库,版本号 8.3.36 本身即为上游修复版本,通常可直接对应。但最严谨的验证方式是检查包的变更日志:
apt changelog php8.3-common 2>/dev/null | grep -m2 -E 'CVE-2026-10961[89]'
如果该命令有相关 CVE 记录输出,则证明补丁已包含在内。
3. 通过 Web 端验证(最可靠)
CLI 和 FPM 可能是不同的 SAPI。创建一个临时的 info.php 文件,通过 Web 服务器访问,确认显示的版本是 8.3.36,然后立即删除该文件。
📝 升级后检查清单
-
检查扩展完整性:运行
php -m,与升级前记录的扩展列表对比,确保mysqli、pdo_mysql、curl、mbstring等关键扩展没有丢失。 -
检查服务状态:确认 PHP-FPM 和 Web 服务器(Nginx/Apache)均处于
active (running)状态。 -
进行应用冒烟测试:访问你的网站或应用的关键功能页面,确保一切正常。
