要实现同时安装和使用多个 PHP 版本,您必须先添加这个 PPA 源,因为它提供了 Ubuntu 官方仓库中没有的大量 PHP 版本。

以下是配置多个 PHP 版本共存的完整步骤:

📦 1. 添加 PPA 源并安装多个版本

首先,您需要添加 PPA 源,然后就可以像安装普通软件一样安装任意多个 PHP 版本。

  1. # 1. 安装必要工具并添加 PPA 源
  2. sudo apt install software-properties-common
  3. sudo add-apt-repository ppa:ondrej/php
  4. sudo apt update
  5. # 2. 安装您需要的 PHP 版本,例如同时安装 7.4 和 8.2
  6. # 可以根据需要安装更多常用扩展,如 php-x.x-mysql, php-x.x-gd 等
  7. sudo apt install php7.4 php7.4-cli php7.4-common php7.4-curl php7.4-mbstring php7.4-xml php7.4-zip
  8. sudo 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 版本。

  1. 注册版本:将安装的 PHP 版本注册到系统中。

    1. sudo update-alternatives --install /usr/bin/php php /usr/bin/php7.4 74
    2. sudo update-alternatives --install /usr/bin/php php /usr/bin/php8.2 82

    这里的 7482 是优先级,数字越大优先级越高。

  2. 交互式切换:运行以下命令,会弹出一个列表让你选择想要的版本。

    1. sudo update-alternatives --config php

    根据提示输入对应版本的数字,按回车即可切换。

  3. 说明
    1. update-alternatives 专门用来管理你在终端(命令行)里输入 php 时调用的版本,它通常不影响你的网站(Nginx/Apache)使用哪个版本。

🌐 3. 配置 Web 服务器版本

Web 服务器(如 Apache 或 Nginx)的配置与命令行版本是独立的,需要单独设置。

Apache 配置

Apache 通过模块来支持 PHP,切换版本就是禁用旧模块,启用新模块。

  1. # 禁用旧版本模块 (例如 7.4)
  2. sudo a2dismod php7.4
  3. # 启用新版本模块 (例如 8.2)
  4. sudo a2enmod php8.2
  5. # 重启 Apache 服务使配置生效
  6. sudo systemctl restart apache2

Nginx + PHP-FPM 配置

Nginx 本身不处理 PHP,而是通过 FastCGI 协议将请求转发给 PHP-FPM 进程。每个 PHP 版本都有自己独立的 FPM 服务。

  1. 安装 FPM:在安装 PHP 时,确保安装了对应版本的 FPM 包,例如 php7.4-fpmphp8.2-fpm

  2. 修改站点配置:编辑 Nginx 的站点配置文件(通常在 /etc/nginx/sites-available/ 下),找到处理 PHP 请求的 location ~ \.php$ 部分,修改 fastcgi_pass 指令,使其指向对应版本的 Socket 文件。

    • 使用 PHP 7.4 的站点配置:
      1. fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    • 使用 PHP 8.2 的站点配置:
      1. fastcgi_pass unix:/run/php/php8.2-fpm.sock;
  3. 重启服务:修改配置后,重启 Nginx 和对应的 PHP-FPM 服务。

    1. sudo systemctl restart php7.4-fpm # 或 php8.2-fpm
    2. sudo 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 和内存空间。

如何操作?

你不需要把它们“绑”在一起启动,而是分别启动各自的服务:

  1. 启动 PHP 7.4 的 FPM 服务
  2. sudo systemctl start php7.4-fpm
  3. 启动 PHP 8.1 的 FPM 服务
  4. sudo systemctl start php8.1-fpm
  5. 查看状态,确认两者都在运行 (active (running))
  6. sudo systemctl status php7.4-fpm
  7. sudo systemctl status php8.1-fpm
  8. 如果你想让它们开机自动运行,可以分别执行 enable:
  9. sudo systemctl enable php7.4-fpm
  10. sudo 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 路径或端口。

  1. PHP 7.4: listen = /run/php/php7.4-fpm.sock
  2. PHP 8.1: listen = /run/php/php8.1-fpm.sock