Linux下PHP版本管理实用指南
一、方案总览
- 发行版仓库 + 多版本包:在 Debian/Ubuntu 使用 Ondřej Surý 的 PPA(ppa:ondrej/php) 安装多个并行版本(如 php7.4、php8.0、php8.1、php8.2),配合 update-alternatives 或按需启用不同版本;在 RHEL/CentOS 使用 Remi 仓库 实现多版本并行。适合快速落地、系统级管理。
- PHP 版本管理器:使用 phpbrew(编译安装、隔离环境、按项目切换)或 phpenv + php-build(rbenv 风格、插件化安装),适合开发与测试,能精细控制编译选项与扩展。
- Web 服务侧多版本共存:以 PHP-FPM 为核心,给不同版本分配不同 端口(如 9000/9001) 或 Unix Socket(如 /run/php/php7.4-fpm.sock、/run/php/php8.2-fpm.sock),再由 Nginx/Apache 按虚拟主机或目录选择对应版本。适合一台机器服务多个项目、各版本长期并存。
二、发行版仓库快速安装与切换(Ubuntu/Debian 示例)
- 添加仓库并安装多版本 CLI/FPM(示例为 php7.4、php8.2):
- sudo apt-get update
- sudo apt-get install -y software-properties-common
- sudo add-apt-repository -y ppa:ondrej/php
- sudo apt-get update
- sudo apt-get install -y php7.4-cli php7.4-fpm php8.2-cli php8.2-fpm
- 命令行快速切换默认版本(系统级):
- sudo update-alternatives --set php /usr/bin/php7.4
- sudo update-alternatives --set php /usr/bin/php8.2
- 验证:php -v
- 按需启用模块(示例为 CLI 与 FPM):
- sudo a2enmod php7.4
- sudo a2enmod php8.2
- sudo systemctl restart apache2
- 说明:FPM 实例会分别以 php7.4-fpm、php8.2-fpm 服务运行,后续在 Web 服务侧按虚拟主机选择对应实例即可。
三、使用版本管理器 phpbrew(适合开发与隔离)
- 安装与初始化:
- sudo apt-get install -y git
- git clone https://github.com/phpbrew/phpbrew.git /usr/src/phpbrew
- cd /usr/src/phpbrew && ./phpbrew init
- echo ‘[[ -e ~/.phpbrew/bashrc ]] && source ~/.phpbrew/bashrc’ >> ~/.bashrc
- source ~/.bashrc
- 安装与切换版本(示例为 7.4.33):
- phpbrew install 7.4.33 +default
- phpbrew switch 7.4.33
- 验证:php -v
- 提示:phpbrew 会在用户目录编译并管理多版本,互不干扰;适合在 CLI 和 FPM(需自行配置 pool) 场景中使用。
四、使用 phpenv + php-build(rbenv 风格)
- 安装 phpenv 与 php-build:
- git clone https://github.com/CHH/phpenv.git ~/.phpenv
- echo ‘export PATH=“$HOME/.phpenv/bin:$PATH”’ >> ~/.bashrc
- echo ‘eval “$(phpenv init -)”’ >> ~/.bashrc
- source ~/.bashrc
- git clone https://github.com/CHH/php-build.git ~/.phpenv/plugins/php-build
- 安装与切换版本:
- phpenv install --list
- phpenv install 7.4.33
- phpenv local 7.4.33 # 当前项目目录生效
- phpenv versions # 查看已装版本
- 说明:与 rbenv 类似,支持 项目级版本 与 全局版本,便于团队协作与 CI。
五、Web 服务侧多版本共存与切换(Nginx + PHP-FPM 实战)
- 架构要点:不同版本的 PHP-FPM 监听不同 TCP 端口 或 Unix Socket,Nginx 在 server 块 中通过 fastcgi_pass 指定对应目标,实现同机多版本并行。
- 方案一(TCP 端口,示例:php7.4 用 9000,php8.2 用 9001)
- FPM 配置(/etc/php/7.4/fpm/pool.d/www.conf 与 8.2 的对应文件):
- listen = 127.0.0.1:9000 # php7.4
- listen = 127.0.0.1:9001 # php8.2
- Nginx 配置片段:
- server {
- listen 80; server_name app74.test; root /var/www/app74;
- location ~ .php$ {
- include snippets/fastcgi-php.conf;
- fastcgi_pass 127.0.0.1:9000;
- }
- }
- server {
- listen 80; server_name app82.test; root /var/www/app82;
- location ~ .php$ {
- include snippets/fastcgi-php.conf;
- fastcgi_pass 127.0.0.1:9001;
- }
- }
- 方案二(Unix Socket,示例:/run/php/php7.4-fpm.sock、/run/php/php8.2-fpm.sock)
- FPM 配置:
- listen = /run/php/php7.4-fpm.sock
- listen = /run/php/php8.2-fpm.sock
- Nginx 配置片段:
- fastcgi_pass unix:/run/php/php7.4-fpm.sock; # 或 php8.2-fpm.sock
- 生效与验证:
- 重启服务:sudo systemctl restart php7.4-fpm php8.2-fpm nginx
- 创建测试文件:echo “<?php phpinfo();” | sudo tee /var/www/app74/info.php
- 访问对应域名查看 PHP 版本 与 SAPI/FPM 信息。