编程

如何在 Ubuntu 和 Debian 上安装升级 PHP 8.3

1789 2023-11-23 00:08:00

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 扩展及其包名称。

扩展名包名
Xdebugphp8.3-xdebug
Redisphp8.3-redis
PCovphp8.3-pcov
Image Magickphp8.3-imagick
APCuphp8.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_phpmod_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 进程和进程模型。

phpenmodphpdismod 脚本为 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}