编程

如何在 Fedora、RHEL、CentOS 下安装或升级到 PHP 8.3

1980 2023-11-23 16:02:00

PHP 8.3 是 2023 年 PHP 的主要新更新。它带来了许多新特性,如类型化类常量、DateTime 扩展中的颗粒度 Exception、新增 json_validate 函数,以及一些特性更改和弃用。和往常一样,PHP 8.3 带来了一些错误修复和改进,以及性能改进。

本文介绍了如何在现代 Fedora 系统、Red Hat Enterprise Linux 和其他兼容 RHEL 的系统上(比如, CentOS、Alma Linux、Rocky Linux)安装 PHP 8.3。一些最流行的 PECL 扩展也可以以类似的方式进行安装,这些扩展在“安装 PECL 扩展”部分中列出。这使用了由 Remi Collet 维护的仓库,其已经在这些系统上维护 PHP 包十多年了。

类似的向导在 Debian 和 Ubuntu 上

在 Debian 和 Ubuntu 上安装/升级 PHP 8.3 也有类似的指南。

这将安装作为软件集合的 PHP 8.3,并且使多个 PHP 版本可以在同一系统上共存。

快速开始

以一个能够 sudo 的用户,在 Fedora 或 RHEL/Alma/Rocky/CentOS Stream 终端中运行以下命令。有关详细步骤,请参阅详细安装/升级指南。

在 Fedora 37、38 和 39 上安装 PHP 8.3

# Save existing php package list to packages.txt file
sudo dnf list installed | grep php | tee packages.txt

# Add Remi's repo
sudo dnf install https://rpms.remirepo.net/fedora/remi-release-$(cut -d ' ' -f 3 /etc/fedora-release).rpm
sudo dnf config-manager --set-enabled remi

# Install new PHP 8.3 packages
sudo dnf install php83 php83-php-fpm

# Remove old packages
sudo dnf remove php82*

# Create symlinks from `php` to actual PHP binary
sudo dnf install php83-syspaths -y

在 RHEL/Alma/Rocky/CentOS Stream/EL 等上安装 PHP 8.3

要求 RHEL 8.8 或者 9.2,或者基于 Enterprise Linux 8/9 的 Alma/Rocky/CentOS Stream/EL 版本。

# Save existing php package list to packages.txt file
sudo dnf list installed | grep php | tee packages.txt

# Add Remi's repo
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-$(cut -d ' ' -f 4 /etc/redhat-release | cut -d '.' -f 1).noarch.rpm -y
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-$(cut -d ' ' -f 4 /etc/redhat-release | cut -d '.' -f 1).rpm -y

# Install new PHP 8.3 packages
sudo dnf install php83 php83-php-fpm

# Remove old packages
sudo dnf remove php82*

# Create symlinks from `php` to actual PHP binary
sudo dnf install php83-syspaths -y

详细安装/升级向导

1. 前置要求

本文中列出的步骤应适用于 Fedora 37、38 和 39、RHEL 8.8 和 9.2,以及基于 EL 8 和 9 的 Enterprise Linux 衍生产品,如 Alma、Rocky、CentOS Stream 等。

警惕:未来可能发生的破坏性行动

以下操作将作为 sudo 执行,并且需要该级别的权限才能继续。在进行任何系统范围的更改时,通常的警告也适用于此处。继续之前,请确保备份系统并检查备份。

升级时,不要忘记将配置迁移到新的 PHP 版本。

2. 列出并记录现有的 PHP 包

当升级现有的 PHP 版本时,以下命令列出了所有安装的包名称中带有 PHP 一词的包,并将其保存到 packages.txt 文件中,并在终端中打印。

这将有助于在接下来的步骤中安装相应的 PHP 8.3 包。

在新系统上安装 PHP 时,不需要执行此步骤。

sudo dnf list installed | grep php | tee packages.txt

3. 添加 Remi 仓库

默认情况下,第一个包含 PHP8.3 的 Fedora 版本是 Fedora 40。这意味着,对于 Fedora 37 到 39,PHP 必须从源代码编译,或者应该来自外部仓库。Fedora 40 及更高版本将不需要此步骤。

在基于 Enterprise Linux 8 或 9 的 RHEL 及其衍生产品上,其默认存储库中也没有 PHP 8.3 包。

Remi Collect 为 Fedora、RHEL 和 Enterprise Linux 维护了几个存储库(Alma、Rocky、CentOS 等兼容 EL 的系统),其中包括 PHP 8.3 和几个 PECL 扩展。本文解释了如何添加合适的存储库并使用 Remi 仓库中可用的软件包。

以下命令将存储库添加到 dnf 的软件存储库列表中。它不会覆盖不同 PHP 版本上的任何其他 PHP 包。多个 PHP 版本可以共存。有关更多信息,请参阅与其他版本一起运行 PHP 8.3。

Fedora 37、38 和 39

sudo dnf install https://rpms.remirepo.net/fedora/remi-release-$(cut -d ' ' -f 3 /etc/fedora-release).rpm
sudo dnf config-manager --set-enabled remi

RHEL/Alma/Rocky/CentOS/ 等

sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-$(cut -d ' ' -f 4 /etc/redhat-release | cut -d '.' -f 1).noarch.rpm -y
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-$(cut -d ' ' -f 4 /etc/redhat-release | cut -d '.' -f 1).rpm -y

4. 安装 PHP 8.3 包

添加并启用 Remi 仓库后, PHP 包可以使用 dnf 安装。主要的 php83 包安装了通用的 PHP 扩展以及 PHP CLI。其他扩展(包括 PECL 扩展)遵循 php83-php-XYZ 模式,其中 XYZ 是扩展的名称.

sudo dnf install php83 php83-php-fpm

这个php83 包安装了多个通用的 PHP 包。这安装了 PHP CLI 包作为依赖(php83-php-cli)

php83-php-fpm 为 web 服务器集成安装了 PHP 的 FPM SAPI。更多信息请查阅 Web 服务器集成。

5. 额外的 PHP 扩展

php83 主包安装了诸如 FPM、PDO、Opcache、XML 和 Sodium。Remi 仓库包含了多个 PHP 核心扩展及 PECL 扩展,你可以使用 dnf 进行安装。

PHP 核心扩展使用命名模式 php83-php-XYZ,而 PECL 扩展使用 php83-php-pecl-XYZ 命名。如果没有命名冲突, PECL 也可以通过 php83-php 前缀获取。 

以下是一些 PHP 核心及 PECL 扩展,以及它们的包名,可以使用 dnf install 安装。

扩展名包名
Intlphp83-php-intl
BCMathphp83-php-bcmath
Xdebugphp83-php-pecl-xdebug
Redisphp83-php-pecl-redis
PCovphp83-php-pecl-pcov
Image Magickphp83-php-pecl-imagick
APCuphp83-php-pecl-apcu
sudo dnf install php83-php-pecl-xdebug

下面在 dnf 上运行一个简单的搜索:

sudo dnf search php83-php | grep apcu # Look for "APCu" extension

如果由于兼容性问题,如果上游扩展没有在 PHP 8.3 上编译,则某些 PECL 扩展可能在 PHP 8.3 中不可用。

升级时,参考步骤 2 中创建的 packages.txt 文件,重新安装 PHP 8.3。

6. Web 服务器集成

PHP 作为一个 web 编程语言,将 PH P与 web 服务器集成是非常常见的。通过 Fast CGI 协议与 PHP-FPM 集成是最常见的方法,同时也可以将 PHP 与其他 SAPI 及框架(如 Swoole)集成。

启用并开启 PHP 8.3 FPM 服务

php8.3-php-fpm 包创建了必要的 systemd 单元文件,以将 PHP 8.3 FPM 作为系统服务运行,但默认情况下不会启用它。

要使其能够在服务器启动时自动运行,并立即启动服务,请运行以下操作:

sudo systemctl enable php83-php-fpm
sudo systemctl start php83-php-fpm

Apache web 服务器
在安装 php83-php-fpm 包时,如果存在 Apache web 服务器(apache2),则会有一个新的 /etc/httpd/conf.d/php83-php.conf 文件,它可以方便地自动启用 PHP 支持。

从现有的 PHP 版本升级时,请确保从 /etc/httpd/conf.d 目录中删除旧的 phpXX-php.conf 文件。

Nginx, Caddy, Litespeed 及其他基于 Fast CGI 的服务器

来自 Remi 仓库的 PHP 8.3-FPM 的默认 socket 地址是 /var/opt/remi/php83/run/php-fpm/www.sock

对于诸如 Nginx、Caddy、Litespeed 等通过 Fast CGI 与 PHP 集成 web 服务器,请将 UNIX socket 路径修改/配置为此 UNIX socket 地址。比如 Nginx, 这涉及 fastcgi_pass 指令:

- fastcgi_pass unix:/var/opt/remi/php82/run/php-fpm/www.sock;
+ fastcgi_pass unix:/var/opt/remi/php83/run/php-fpm/www.sock;

7. 测试 PHP 8.3 安装

安装完以上这些包后,就到了关键时刻,看看新的安装是否成功。

在终端中运行 php83 -v 显示如下内容:

                                  调用 `php83 -v` 显示 PHP 版本号及创建日期

Invoke PHP 8.3 CLI from php
See Running PHP 8.3 Alongside Other Versions to invoke PHP 8.3 CLI from php command. Because this guide encourages the possibility of installing multiple PHP versions alongside each other, PHP 8.3 CLI is invoked as php83 by default.

模块列表可以用 php-m 列出。此列表将包括几个捆绑的 PHP 扩展。请参阅迁移配置,了解如何将 PHP INI 指令和启用的扩展迁移到新的 PHP 版本。

8. 迁移配置

这一步只适用于从老版本 PHP 中升级到 PHP 8.3

PHP 8.3 的配置文件位于 /etc/opt/remi/php83 目录。已存在的 PHP 安装应该也在 /etc/opt/remi/ 或者 /etc/php 目录。

不要将现有的 PHP INI 文件复制到 /etc/opt/remi/php83。当从 PHP 8.2 或者最新版本上升级时,它可能不能生效。建议手动复制 INI 指令。

请参阅 PHP 8.3 中的新增和更改内容,以查看弃用的 INI 指令和在 PHP 8.3 中添加的新 INI 指令。

使用 PHP-FPM 时,请确保复制正确数量的 FPM 进程和进程模型(在 /etc/opt/remi/php83/php-fpm.d/www.conf 文件中)。

PHP 扩展的加载文件在 /etc/opt/remi/php83/php.d。删除文件将禁用对于的扩展。

修改完后,重启 PHP 8.3-FPM:

sudo systemctl restart php8.3-fpm

9. 删除老版本 PHP

这一步只适用于从老版本 PHP 中升级到 PHP 8.3

要删除旧版 PHP,请运行 dnf remove 加 PHP 版本前缀。比如,如下命令将删除 PHP 8.2 包及配置:

sudo dnf remove php82*

与其他版本一起运行 PHP 8.3

本文通过安装带有 php83 前缀的 PHP8.3 包,有意避免覆盖现有的 PHP 包。这样,就可以同时安装和运行多个 PHP 版本。

在 Linux 系统上 ,PHP-FPM 作为 UNIX socket 运行,每个 PHP 版本都使用不同的 socket 地址。也可以有多个 PHP FPM 进程,并且 web 服务器可以针对不同的上下文选择性地使用不同的 PHP 版本(例如,example.com 使用 PHP 8.3,而 example.net 使用 PHP 8.2)。

PHP CLI二进制文件可以使用 php83 全局获取 ,这也鼓励同时运行多个 PHP CLI 版本。

全局 php 可执行文件

有些脚本需要 PHP CLI 以 php 显示。通过 dnf 安装 php83-syspaths 包,将会自动创建一个软链接将 /usr/bin/php 指向实际的 PHP 8.3 CLI 可执行文件。

当另一个 phpXY-syspaths 包存在时,安装 php83-syspaths 包将导致 DNF 安装错误,这是尝试声明 /usr.bin/php 软链接造成冲突。请在尝试安装  php83-syspaths 前安装 syspaths 包。

dnf remove php82-syspaths
dnf install php83-syspaths