如何在 Ubuntu 和 Debian 上安装升级 PHP 8.3
PHP 8.3 是 2023 年 PHP 的主要新更新。它带来了一些不错的新功能,如类型化类常量、DateTime 扩展中的一组新 Exception、新增 json_validate
函数,以及一些新功能、更改和弃用。和往常一样,PHP 8.3 带来了一些错误修复和改进,以及性能改进。
本文介绍了如何在现代 Debian 系统和 Ubuntu 系统上安装 PHP 8.3。一些最流行的 PECL 扩展也可以以类似的方式进行安装,这些扩展在“安装 PECL 扩展”部分中列出。
快速开始
以一个能够 sudo 的用户,在 Debian 或 Ubuntu 终端中运行以下命令。有关详细步骤,请参阅详细安装/升级指南。
Debian (10, 11, and 12)
# 将现有的 php 包列表保存到 packages.txt 文件
sudo dpkg -l | grep php | tee packages.txt
# 添加 Ondrej 仓库源和签名密钥以及依赖项
sudo apt install apt-transport-https
sudo curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg
sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
sudo apt update
# 安装新的 PHP 8.3 包
sudo apt install php8.3 php8.3-cli php8.3-{bz2,curl,mbstring,intl}
# 安装 FPM 或 Apache 模块
sudo apt install php8.3-fpm
# 或
# sudo apt install libapache2-mod-php8.3
# Apache: 启用 PHP 8.3 FPM
sudo a2enconf php8.3-fpm
# 从旧版 PHP 中升级:
sudo a2disconf php8.2-fpm
# 移除旧版本
sudo apt purge php8.2*
Ubuntu (20.04, 22.04, and 24.04)
## Save existing php package list to packages.txt file
sudo dpkg -l | grep php | tee packages.txt
# Add Ondrej's PPA
sudo add-apt-repository ppa:ondrej/php # Press enter when prompted.
sudo apt update
# Install new PHP 8.3 packages
sudo apt install php8.3 php8.3-cli php8.3-{bz2,curl,mbstring,intl}
# Install FPM OR Apache module
sudo apt install php8.3-fpm
# OR
# sudo apt install libapache2-mod-php8.2
# On Apache: Enable PHP 8.3 FPM
sudo a2enconf php8.3-fpm
# When upgrading from an older PHP version:
sudo a2disconf php8.2-fpm
## Remove old packages
sudo apt purge php8.2*
详细安装/升级向导
1. 前置要求
当前 Debian 和 Ubuntu 版本的默认软件库中都不包含 PHP 8.3。不过可以从由 Ondřej Surý 维护的仓库可以获得预构建的 PHP 包。该仓库中的包遵循与操作系统软件存储库提供的 PHP 包相同的包配置、包名称和 systemd
配置。
本文主要聚焦于 Ubuntu 22.04 (Jammy), Ubuntu 20.04 (Focal), Ubuntu 24.04 (Noble), Debian 10 (Buster), Debian 11 (Bullseye), 和 Debian 12 (Bookworm).
警惕:未来可能发生的破坏性行动
以下操作将作为
sudo
执行,并且需要该级别的权限才能继续。在进行任何系统范围的更改时,通常的警告也适用于此处。继续之前,请确保备份系统并检查备份。升级时,不要忘记将配置迁移到新的 PHP 版本。
2. 列出并记录现有的 PHP 包
当升级现有的 PHP 版本时,以下命令列出了所有安装的包名称中带有 PHP 一词的包,并将其保存到 packages.txt 文件中,并在终端中打印。
这将有助于在接下来的步骤中安装相应的 PHP 8.3 包。
在新系统上安装 PHP 时,不需要执行此步骤。
dpkg -l | grep php | tee packages.txt
3. 添加 ondrej/php
库
PHP 8.3 无法从任何当前 Debian 或 Ubuntu 软件库中下载。由 Ondřej Surý 维护的 Debian 和 Ubuntu 软件库包含了主要的 PHP 8.3 软件包以及多个流行的 PECL 包,并保持更新。
在 Ubuntu 上,软件包仅构建在 LTS 版本上。此步骤将在非 LTS Ubuntu 版本(如 Ubuntu 22.10)上失败。
以下命令将存储库添加到软件存储库列表中,并运行 apt-update
从新存储库和现有存储库中获取可用包的列表。
Debian
sudo apt install apt-transport-https
sudo curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg
sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
sudo apt update
Ubuntu
sudo add-apt-repository ppa:ondrej/php # Press enter when prompted.
sudo apt update
4. 安装 PHP 8.3 包
添加了 Ondrej 的 PHP 存储库,现在可以使用 apt
安装 PHP 包。所有 PHP 8.3 包都遵循 php8.3-XYZ
模式。这些名称匹配并覆盖操作系统自己的软件存储库提供的 PHP 版本。
sudo apt install php8.3-common php8.3-cli php8.3-fpm php8.3-{curl,bz2,mbstring,intl}
php8.3-common
包是一个安装了多个 PHP 扩展的元包。以后可以选择性地禁用单个扩展。PHP 核心扩展,如 Date、Phar、JSON、ctype 和 random 总是包含在内。没有必要也不可能将它们作为单独的软件包安装。
除了安装 php8.3-common
,也可以安装单独的软件包。安装 php8.3-common
大致相当于安装如下所示的所有扩展:
php8.3-cli
安装 PHP cli,并将 /usr/bin/php
软链接到 /usr/bin/php8.3
。有关更多信息,请参阅与其他版本一起运行 PHP 8.3。
php8.3-fpm
安装用于 web 服务器集成的 PHP 的 FPM SAPI。有关其他方法,请参阅 Web 服务器集成。
5. 额外的 PHP 扩展
存储库中还提供了多个 PECL 扩展,可以方便地安装它们,而无需编译它们。这包括一些更流行的 PECL 扩展,如 Image Magick、APCu 和 Xdebug。
以下是要使用 apt-install
进行安装的一些 PECL 扩展及其包名称。
扩展名 | 包名 |
---|---|
Xdebug | php8.3-xdebug |
Redis | php8.3-redis |
PCov | php8.3-pcov |
Image Magick | php8.3-imagick |
APCu | php8.3-apcu |
请注意,这些 PECL 扩展是由单独的开发人员/团队开发的,可能没有经过很好的测试。这些包可能也需要一些时间才能上传,等待相应扩展开发的兼容性修复。
下面在apt
上运行一个简单的搜索:
sudo apt search php8.3-apcu # Search for "apcu" under PHP 8.3
6. Web 服务器整合
在大多数用例中,PHP 与 web 服务器集成在一起。通过 Fast CGI 协议与 PHP-FPM 集成是最常见的方法,同时也可以将 PHP 与其他 SAPI 集成。
Apache web 服务器
在安装 php8.3-fpm
包时,如果存在 Apache web 服务器(apache2
),则会有一个新的 php8.3-fpm.conf
文件,可以方便地切换 PHP 8.3 集成:
sudo a2enconf php8.3-fpm
sudo a2disconf php8.2-fpm # When upgrading from an older PHP version
sudo systemctl restart apache2
当 Apache 被配置为将 PHP 作为 Apache 模块(通常称为 mod_php
或 mod_php8
)运行时,请安装 libapache2-mod-php8.3
包,而不是php8.3-fpm
:
sudo apt install libapache2-mod-php8.3
sudo a2enmod php8.3
sudo a2dismod php8.2 # When upgrading from an older PHP version
sudo systemctl restart apache2
Nginx, Caddy, Litespeed 及其他基于 Fast CGI 的服务器
php8.3-fpm
包安装了 PHP-FPM,并在 socket 地址 /run/php/php8.3-fpm.sock
将 PHP 8.3 FPM 注册为 systemd
服务。
对于通过 Fast CGI 与 PHP 集成的 web 服务器,请将 UNIX socket 路径更改/配置为此 UNIX socket 地址。
比如,在 Nginx 上,这涉及到更改 fastcgi_pass
指令:
- fastcgi_pass unix:/run/php/php8.1-fpm.sock;
+ fastcgi_pass unix:/run/php/php8.2-fpm.sock;
7. 测试 PHP 8.3 安装
安装完以上这些包后,就到了关键时刻,看看新的安装是否成功。
在终端中运行 php -v
显示如下内容:
调用 `php -v` 显示 PHP 版本号及创建日期
模块列表可以用 php-m
列出。此列表将包括几个捆绑的 PHP 扩展。请参阅迁移配置,了解如何将 PHP INI 指令和启用的扩展迁移到新的 PHP 版本。
8. 迁移配置
这一步只适用于从老版本 PHP 中升级到 PHP 8.3
PHP 8.3 的配置文件位于 /etc/php/8.3
目录。已存在的 PHP 安装应该也在 /etc/php
目录。
不要将现有的 PHP INI 文件复制到 /etc/php/8.3
。相反,比较两个相应的 PHP INI 文件,只有在必要时才更新 PHP 8.3 变体。
请参阅 PHP 8.3 中的新增和更改内容,以查看弃用的 INI 指令和在 PHP 8.3 中添加的新 INI 指令。
使用 PHP-FPM 时,请确保复制正确数量的 FPM 进程和进程模型。
phpenmod
和 phpdismod
脚本为 PHP 模块提供了 continent 切换。例如,以下命令禁用了 PHP 8.3 上 FPM 的 phar 扩展:
sudo phpdismod -v 8.3 -s fpm phar
修改完后,重启 PHP 8.3-FPM:
sudo systemctl restart php8.3-fpm
9. 删除老版本 PHP
这一步只适用于从老版本 PHP 中升级到 PHP 8.3
要删除旧版 PHP,请运行 apt purge
加 PHP 版本前缀。比如,如下命令将删除 PHP 8.2 包及配置:
sudo apt purge php8.2*
与其他版本一起运行 PHP 8.3
可以将 PHP 8.3 与其他 PHP 版本一起安装。事实上,当安装 PHP8.3 而不首先删除旧的 PHP 包时,就会发生这种情况。
默认情况下,所有 phpX.Y-cli
软件包在 /usr/bin/phpX.Y
上安装 PHP CLI 二进制文件。这对 PHP 8.3 安装意味着,任何通过 php
调用 PHP CLI 的应用都将使用上次安装的 PHP-CLI 二进制文件(本例中为 PHP 8.3)。当使用多个 PHP 版本时,请确保通过直接调用 /usr/bin/phpX.Y
来调用正确的 PHP 二进制文件。PHP 8.3 可以直接调用为 /usr/bin/php8.3
。
默认情况下,默认的 php
名称将软链接到最新的 php 版本,但也可以更改为默认 php 命令链接的位置。使用 update-alternates
命令更改 php
命令应链接到的路径。
sudo update-alternatives --config php
这将显示一个提示,以交互方式选择 php
指向的替代 PHP 二进制路径。
There are 2 choices for the alternative php (providing /usr/bin/php).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/bin/php8.3 83 auto mode
1 /usr/bin/php8.2 82 manual mode
2 /usr/bin/php8.3 83 manual mode
要在没有交互式提示的情况下设置路径,请执行以下操作:
update-alternatives --set php /usr/bin/php8.2
apt install php8.3-{calendar,ctype,exif,ffi,fileinfo,ftp,gettext,iconv,pdo,phar,posix,shmop,sockets,sysvmsg,sysvsem,sysvshm,tokenizer}