如何在 Ubuntu 和 Debian 上安装或升级到 PHP8(8.3)
本文将介绍如何在现代 Debian 系统和 Ubuntu 系统上安装 PHP 8。一些最流行的 PECL 扩展也可以用类似的方法安装,它们列在安装 PECL 扩展部分。
PHP 8.3 是 2023 年 PHP 的重大更新。它带来了一些不错的新特性,如类型化类常量、DateTime 扩展中的一组新异常、一个新的 json_validate 函数,以及一些新特性、更改和弃用。一如既往,PHP 8.3 还带来了一些错误修复和改进以及性能提升。
类似的指南还有在 RHEL/Fedora/CentOS Stream/Alma/Rocky Linux 上安装/升级 PHP 8。
快速入手
快速启动
以支持 sudo 的用户身份在终端中运行以下 Debian 或 Ubuntu 命令。有关详细步骤,请参阅详细安装/升级指南。
Debian (10, 11, and 12)
# Save existing php package list to packages.txt file
sudo dpkg -l | grep php | tee packages.txt
# Add Ondrej's repo source and signing key along with dependencies
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
# 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.3
# 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*
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。预编译的 PHP 包可以从 Ondřej Surý 维护的软件源中获取,本文使用的就是该软件源。该仓库中的软件包与操作系统软件仓库提供的 PHP 软件包采用相同的软件包配置、软件包名称和 systemd
配置。
本文主要针对 Ubuntu 22.04 (Jammy)、Ubuntu 20.04 (Focal)、Ubuntu 24.04 (Noble)、Debian 10 (Buster)、Debian 11 (Bullseye) 和 Debian 12 (Bookworm)。
想知道 Ubuntu 或 debian 具体的 linux 发行版本号,使用如下命令:
lsb_release -a
2. 列出并记录现有的 PHP 软件包
升级现有 PHP 版本时,以下命令会列出所有已安装的、包名中包含 php
的软件包,并将其保存到 packages.txt
文件中,同时在终端中打印出来。
这将有助于在接下来的步骤中安装相应的 PHP 8 软件包。
在新系统上安装 PHP 时不需要此步骤。
dpkg -l | grep php | tee packages.txt
3. 添加 ondrej/php
repository
目前,PHP 8.3 无法从任何 Debian 或 Ubuntu 软件仓库中下载。由 Ondřej Surý 维护的 Debian 和 Ubuntu 软件仓库包含主要的 PHP 8.3 软件包和几个常用的 PECL 软件包,并且一直保持更新。
在 Ubuntu 上,这些软件包只在 LTS 版本上构建。在 Ubuntu 的非 LTS 版本(如 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 软件包
添加了 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
大致相当于安装所有扩展,如下图所示:apt install php8.3-{calendar,ctype,exif,ffi,fileinfo,ftp,gettext,iconv,pdo,phar,posix,shmop,sockets,sysvmsg,sysvsem,sysvshm,tokenizer}
php8.3-cli
安装 PHP CLI,并将/usr/bin/php
链接到/usr/bin/php8.3
。更多信息,请参阅 “同时运行 PHP 8.3 和其他版本”。- php8.3-fpm 安装了用于网络服务器集成的 PHP FPM SAPI。有关其他方法,请参见web服务器集成。
5. 其它 PHP 扩展
软件仓库中还提供了多个 PECL 扩展,无需编译即可方便地安装。其中包括一些比较流行的 PECL 扩展,如 Image Magick、APCu 和 Xdebug。
以下是一些 PECL 扩展及其软件包名称,可使用 apt install
进行安装。
Extension name | Package name |
---|---|
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
在步骤 #2 中创建的 packages.txt
文件在这里会派上用场,用来参考现有的 PHP 软件包。
6. Web 服务集成
在大多数使用案例中,PHP 都与网络服务器集成。通过快速 CGI 协议与 PHP-FPM 集成是最常见的方法,但也可以将 PHP 与其他 SAPI 集成。
Apache web server
安装 php8.3-fpm
软件包时,如果有 Apache 网络服务器 (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,并在 /run/php/php8.3-fpm.sock
的套接字地址为 PHP 8.3 FPM 注册了 systemd 服务。
对于通过快速 CGI 与 PHP 集成的 Web 服务器,请将 UNIX 套接字路径更改为该 UNIX 套接字地址。
例如,在 Nginx 上,需要更改 fastcgi_pass
指令:
- fastcgi_pass unix:/run/php/php8.1-fpm.sock;
+ fastcgi_pass unix:/run/php/php8.2-fpm.sock;
有关使用 Caddy 服务器与 PHP 的详细文章,请参阅如何使用 Caddy 服务器与 PHP。
7. 测试 PHP 8.3 是否安装成功
安装完所有软件包后,就到了检验新安装是否成功的关键时刻。
在终端运行 php -v
应该会显示如下内容:
Calling `php -v` displays the PHP version number and build date.
可使用 php -m
列出模块列表。该列表将包括几个捆绑的 PHP 扩展模块。请参阅 “迁移配置”,了解如何将 PHP INI 指令和启用的扩展迁移到新的 PHP 版本。
8. 迁移原 php 版本的修改配置
此步骤仅适用于从旧版本 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 中的新变化”,查看 PHP 8.3 中废弃的 INI 指令和新增的 INI 指令。
使用 PHP-FPM 时,请确保复制了正确数量的 FPM 进程和进程模型。
phpenmod 和 phpdismod 脚本为 PHP 模块提供了大陆切换功能。例如,在 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 版本。事实上,在安装 PHP 8.3 时,如果没有先删除旧的 PHP 包,就会出现这种情况。
默认情况下,所有 phpX.Y-cli 软件包都将 PHP CLI 二进制文件安装在 /usr/bin/phpX.Y 位置。这对 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-alternatives 命令更改 php 命令的链接路径。
sudo update-alternatives --config php
这将弹出提示,以交互方式选择 php 指向的 PHP bin 路径。
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