编程

如何在 Debian/Ubuntu 上安装 PHP 8.2

1858 2022-11-24 17:55:37

PHP 8.2 带来了许多新特性,比如只读类、新的 random 扩展、敏感参数去敏以及语言上的一些精简如动态熟悉的弃用及字符串解析相关弃用。

目前,Debain 和 Ubuntu 的软件仓库还没有提供正式的 PHP 8.2 软件包,不过可以从由 Ondřej Surý 维护的仓库可以获得。Ondrej 的存储库是主要的、最新的存储库,为基于 Debian 和 Ubuntu 的操作系统提供 PHP 包和 PECL 扩展。

PHP 8.2 有哪些新增特性和更改

PHP 8.2 为安全和性能带来了一个健康的新特性列表,以及一些可能会在现有旧版本上发出额外警告的弃用,因为它弃用了动态属性以及其他一些弃用。

PHP 8.2 没有包含任何可能影响安装或升级过程的显著更改。事实上,PHP 8.2 确实添加了一个名为 random 的新扩展,但这个扩展始终是一个捆绑的扩展,没有它 PHP 无法编译。

PHP 的 INI 设置和文件中的一个显著变化是,PHP 8.2 在旧版本中禁用了格式错误的INI时发出警告。有关详细信息,请参阅 PHP 8.2:INI 解析警告。

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

快速开始

下面是安装/升级到 PHP 8.2 的命令行:

Ubuntu

sudo dpkg -l | grep php | tee packages.txt
sudo add-apt-repository ppa:ondrej/php # Press enter when prompted.
sudo apt update
sudo apt install php8.2,php8.2-cli,php-8.2{bz2,curl,mbstring,intl}

sudo apt install php8.2-fpm
# OR
# sudo apt install libapache2-mod-php8.2

sudo a2enconf php8.2-fpm

# When upgrading from older PHP version:
sudo a2disconf php8.1-fpm

## Remove old packages
sudo apt purge php8.1*

Debian

sudo dpkg -l | grep php | tee packages.txt

sudo apt install apt-transport-https lsb-release ca-certificates wget -y
sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg 
sudo sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
sudo apt update

# Expand the curly braces with all extensions necessary.
sudo apt install php8.2,php8.2-cli,php-8.2{bz2,curl,mbstring,intl}

sudo apt install php8.2-fpm
# OR
# sudo apt install libapache2-mod-php8.2

sudo a2enconf php8.2-fpm

# When upgrading from older PHP version:
sudo a2disconf php8.1-fpm

## Remove old packages
sudo apt purge php8.1*

详细教程

1. 列出并存储 PHP 扩展列表

以下命令列出了当前系统中存在的所有与PHP相关的包,并将它们保存到名为 packages.txt 的文本文件中。这有助于在 PHP 8.2 上重建相同的包列表。

在新安装时,不需要执行此步骤。

dpkg -l | grep php | tee packages.txt

2. 添加 ondrej/php PPA 作为软件仓库.

Ondžej Surý 维护的存储库包含主要的 PHP 包,并保持着更新。

将此存储库添加到系统的软件源列表后,可以使用标准 apt 命令完成初始安装和更新。

Ubuntu LTS Versions

sudo add-apt-repository ppa:ondrej/php # Press enter when prompted.
sudo apt update

Debian

sudo apt install apt-transport-https lsb-release ca-certificates ```
software-properties-common
sudo add-apt-repository ppa:ondrej/php # Press enter when prompted.
sudo apt update

3. 安装 PHP 8.2 及其扩展

步骤 2 中添加的存储库中的所有 PHP 8.2 包都遵循 php 8.2 命名模式。PHP 中的捆绑扩展,如 json、ctype、date、random 等,不需要手动安装。

php8.2-common 包包括几个常见的 PHP 包。以后可以选择性地禁用不必要的扩展。

sudo apt install php8.2 php8.2-cli php8.2-{curl,bz2,mbstring,intl}

展开上面的大括号,以包括新系统上所需的所有扩展。当升级现有的 PHP 设置时。txt 文件应该列出所有当前的 PHP 包。

4. 安装和启用服务器 API

在 web 服务器与 PHP 集成的系统上,安装额外的服务器 API 包。以下是最流行组合的一些示例:

Apache web 服务器 + PHP-FPM

sudo apt install php8.2-fpm
sudo a2enconf php8.2-fpm
sudo a2disconf php8.1-fpm # When upgrading from an older PHP version
sudo service apache2 restart

Apache web 服务器 + PHP 作为 Apha 模块
不建议将 PHP 安装为 Apache 模块,除非边缘用例需要这样做。

sudo apt install libapache2-mod-php8.2
sudo a2enmod php8.2
sudo a2dismod php8.1 # When upgrading from an older PHP version
sudo service apache2 restart

Nginx web 服务器 + PHP-FPM

sudo apt install php8.2-fpm
sudo service nginx restart

然后,编辑相关的 Nginx 配置文件以指向 fastcgi_pass 指令中的新 PHP socket:

- fastcgi_pass unix:/run/php/php8.1-fpm.sock;
+ fastcgi_pass unix:/run/php/php8.2-fpm.sock;

5. 测试 PHP 8.2 安装

运行下面命令进行测试:

php -v
php -m

预期输出将显示 PHP 8.2,以及已启用的 PHP 扩展列表。

要测试 web 服务器集成,请尝试通过 web 服务器运行 PHP 文件。

6. 清除旧版本 PHP 

以下命令删除旧的 PHP 版本。建议在验证 PHP 8.2 安装是否正常工作之前不要删除它们。

sudo apt purge php8.1* # Change "php8.1" with the old PHP version names.

这也会删除要删除的包的配置文件。

与其他版本一起运行多个 PHP 8.2

不必全局安装 PHP 8.2,也不必删除旧的 PHP 版本,因为可以在同一服务器上同时运行多个 PHP 版本。

默认情况下,PHP 8.2 CLI 将安装在 /usr/bin/php8.2 位置,但被链接。类似地,其他 PHP 二进制文件将位于同一目录中(/usr/bin/pphp8.0/usr/bin/php7.4 等)。默认情况下,默认 php 名称将符号链接到最新的 php 版本,但可以更改默认 php 命令链接到的位置。

如果有多个 PHP 版本链接到同一 PHP 路径,update-alternates 命令提供了一种在 PHP CLI 的 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.2   82        auto mode
  1            /usr/bin/php8.1   81        manual mode
  2            /usr/bin/php8.2   82        manual mode

要在没有交互式提示的情况下设置路径,请执行以下操作:

update-alternatives --set php /usr/bin/php8.1