要实现同时安装和使用多个 PHP 版本,您必须先添加这个 PPA 源,因为它提供了 Ubuntu 官方仓库中没有的大量 PHP 版本。
以下是配置多个 PHP 版本共存的完整步骤:
📦 1. 添加 PPA 源并安装多个版本
首先,您需要添加 PPA 源,然后就可以像安装普通软件一样安装任意多个 PHP 版本。
# 1. 安装必要工具并添加 PPA 源sudo apt install software-properties-commonsudo add-apt-repository ppa:ondrej/phpsudo apt update# 2. 安装您需要的 PHP 版本,例如同时安装 7.4 和 8.2# 可以根据需要安装更多常用扩展,如 php-x.x-mysql, php-x.x-gd 等sudo apt install php7.4 php7.4-cli php7.4-common php7.4-curl php7.4-mbstring php7.4-xml php7.4-zipsudo apt install php8.2 php8.2-cli php8.2-common php8.2-curl php8.2-mbstring php8.2-xml php8.2-zip
⌨️ 2. 配置命令行 (CLI) 版本切换
安装完成后,您可以使用 update-alternatives 工具来管理在终端中使用的默认 php 版本。
注册版本:将安装的 PHP 版本注册到系统中。
sudo update-alternatives --install /usr/bin/php php /usr/bin/php7.4 74sudo update-alternatives --install /usr/bin/php php /usr/bin/php8.2 82
这里的
74和82是优先级,数字越大优先级越高。交互式切换:运行以下命令,会弹出一个列表让你选择想要的版本。
sudo update-alternatives --config php
根据提示输入对应版本的数字,按回车即可切换。
- 说明
update-alternatives 专门用来管理你在终端(命令行)里输入 php 时调用的版本,它通常不影响你的网站(Nginx/Apache)使用哪个版本。
🌐 3. 配置 Web 服务器版本
Web 服务器(如 Apache 或 Nginx)的配置与命令行版本是独立的,需要单独设置。
Apache 配置
Apache 通过模块来支持 PHP,切换版本就是禁用旧模块,启用新模块。
# 禁用旧版本模块 (例如 7.4)sudo a2dismod php7.4# 启用新版本模块 (例如 8.2)sudo a2enmod php8.2# 重启 Apache 服务使配置生效sudo systemctl restart apache2
Nginx + PHP-FPM 配置
Nginx 本身不处理 PHP,而是通过 FastCGI 协议将请求转发给 PHP-FPM 进程。每个 PHP 版本都有自己独立的 FPM 服务。
安装 FPM:在安装 PHP 时,确保安装了对应版本的 FPM 包,例如
php7.4-fpm和php8.2-fpm。修改站点配置:编辑 Nginx 的站点配置文件(通常在
/etc/nginx/sites-available/下),找到处理 PHP 请求的location ~ \.php$部分,修改fastcgi_pass指令,使其指向对应版本的 Socket 文件。- 使用 PHP 7.4 的站点配置:
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
- 使用 PHP 8.2 的站点配置:
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
- 使用 PHP 7.4 的站点配置:
重启服务:修改配置后,重启 Nginx 和对应的 PHP-FPM 服务。
sudo systemctl restart php7.4-fpm # 或 php8.2-fpmsudo systemctl restart nginx
通过这种方式,您可以让不同的网站或项目使用完全不同的 PHP 版本。
✅ 4. 验证配置
- 验证 CLI 版本:在终端执行
php -v,查看输出的版本是否符合预期。 - 验证 Web 版本:在网站根目录创建一个包含
<?php phpinfo(); ?>的 PHP 文件,然后通过浏览器访问,页面显示的 PHP 版本即为 Web 服务器当前使用的版本。
同时运行多个PHP版本
你可以同时运行 php7.4-fpm 和 php8.1-fpm(以及任何其他版本),它们会互不干扰地在后台并行工作。
这正是实现“多版本共存”的核心机制:Web 服务器(Nginx/Apache)根据站点配置,决定将请求“扔”给哪个版本的 PHP-FPM 处理。
以下是详细的原理和注意事项:
为什么可以同时运行?
每个版本的 PHP-FPM 都是一个独立的服务,它们通过以下方式实现隔离:
独立的配置文件:PHP 7.4 的配置在 /etc/php/7.4/…,而 PHP 8.1 的在 /etc/php/8.1/…。
独立的监听地址(关键点):
- 它们通常监听不同的 Unix Socket 文件(例如 php7.4-fpm.sock 和 php8.1-fpm.sock)。
- 或者配置为监听不同的 TCP 端口(例如 9000 和 9001)。
独立的进程:它们拥有各自独立的进程 ID 和内存空间。
如何操作?
你不需要把它们“绑”在一起启动,而是分别启动各自的服务:
启动 PHP 7.4 的 FPM 服务sudo systemctl start php7.4-fpm启动 PHP 8.1 的 FPM 服务sudo systemctl start php8.1-fpm查看状态,确认两者都在运行 (active (running))sudo systemctl status php7.4-fpmsudo systemctl status php8.1-fpm如果你想让它们开机自动运行,可以分别执行 enable:sudo systemctl enable php7.4-fpmsudo systemctl enable php8.1-fpm
如果报错 “Address already in use” 怎么办?
如果你尝试启动第二个版本时失败了,提示端口冲突,那通常是因为配置错误。
原因:两个版本的配置文件(通常在 /etc/php/x.x/fpm/pool.d/www.conf)中,listen 参数被设置成了相同的值(例如都默认用了 127.0.0.1:9000)。
解决:确保每个版本的 www.conf 文件中,listen 指向唯一的 Socket 路径或端口。
PHP 7.4: listen = /run/php/php7.4-fpm.sockPHP 8.1: listen = /run/php/php8.1-fpm.sock
