PHP多版本共存终极填坑指南:一台服务器部署多实例的最佳实践

概述

本文针对中小企业在同一台服务器上同时维护多个PHP版本(如5.5、5.6、7.4等)的实际需求,提供了一套完整的解决方案。从源码编译安装不同版本的PHP,到独立配置多实例php-fpm(包括端口隔离、用户权限管理),再到Nginx集成、Redis扩展安装及常见编译问题的修复,全面覆盖部署过程中的核心难点。文章以CentOS 7.8环境为例,结合实战场景详细解析编译参数优化、依赖项配置、Yum源加速等关键操作,帮助开发者规避版本冲突、依赖缺失等"深坑",实现老旧项目与新技术栈的无缝共存。

环境部署痛点

很多PHP的同学应该都遇到这样的坑,尤其是中小企业的后端开发工程师,同一台服务器上运行着好几个不同版本的环境,没有文档,一看就让人头大,这里我要用一篇博客彻底讲清楚PHP源码安装,已经同一台机器怎么部署多个php-fpm实例,后面会安装redis扩展的实践,以及实践过程中遇到的问题和解决方案做一个详细的汇总。

实践

操作实践的前提是生产环境已经运行着一个php5.5的版本,这个项目比较老,但是比较重要,所以操作起来要特别谨慎,服务器是Centos 7.8,查看当前服务器版本的命令lsb_release -a

下载源码包

首先打开PHP官网https://www.php.net/releases/下载所需要的源码包,选好需要的版本进行下载,这里要写一个小小的技巧,源码时的url是 https://www.php.net/distributions/php-版本号.tar.gz,比如我的是5.6.37 和 7.4.28 版本。

新建一个文件夹存放源码包,比如:/usr/local/soft,下面我下载和解压5.6.37版本的源码包。

shell 复制代码
# 下载5.6.37 源码包Url
wget https://www.php.net/distributions/php-5.6.37.tar.gz

# 下载7.4.28 源码包Url
wget https://www.php.net/distributions/php-7.4.28.tar.gz

tar -zxvf php-5.6.37.tar.gz

解压php源码压缩包,新建一个文件夹并设置所属组和所属人,这里我所设置的所属组和所属人都是www,这个要和下一步编译的保持一致,下面的操作以我自己的设置为准了。

shell 复制代码
mkdir -p /usr/local/php56 && chown -R www:www /usr/local/php56

源码安装

源码安装有一点的难度,难度在于如果你的gcc或者是缺少编译的支持会产生错误信息,但是可以去deepseek上搜索,比之前已经高效很多了,参考lnmp的默认安装扩展开启的扩展,你操作的时候根据自己的需要来设置是否开启扩展。

1.安装路径和 FPM 相关:

  • --prefix=/usr/local/php56:指定 PHP 的安装目录为 /usr/local/php56。
  • --with-fpm-user=www--with-fpm-group=www:设定 PHP-FPM 进程运行时的用户和用户组为 www。
  • --enable-fpm:启用 FastCGI 进程管理器(FPM),FPM 能够高效处理 PHP 请求,特别适用于高并发场景。

2.数据库相关

  • --with-mysql=mysqlnd、--with-mysqli=mysqlnd、--with-pdo-mysql=mysqlnd:借助 mysqlnd(MySQL 原生驱动)让 PHP 支持不同方式连接 MySQL 数据库。mysqli 是改进版的 MySQL 扩展,PDO 则是统一访问不同数据库的抽象层。

3.字符编码和图像处理相关

  • --with-iconv-dir:指定 iconv 库的目录,iconv 扩展可实现字符编码的转换,避免出现乱码。
  • --with-jpeg-dir、--with-png-dir:指定 JPEG 和 PNG 图像库的目录,结合 --with-gd 让 PHP 可以处理 JPEG 和 PNG 图像。
  • --with-gd 和 --enable-gd-native-ttf:启用 GD 库,用于图像处理,--enable-gd-native-ttf 支持在图像中使用 TrueType 字体。

4.数据压缩和 XML 处理相关

  • --with-zlib:启用 zlib 扩展,用于数据的压缩和解压缩,可减小数据传输体积。
  • --enable-xml:开启对 XML 的支持,使 PHP 能解析和生成 XML 数据,常用于与 Web 服务交互。

5.数学运算和内存管理相关

  • --enable-bcmath:启用任意精度数学运算扩展,用于处理大数字的高精度计算。
  • --enable-shmop:启用共享内存操作扩展,支持在多个进程间共享数据。
  • --enable-sysvsem:启用系统 V 信号量支持,用于进程间的同步和互斥。

6.网络相关

  • --with-curl:启用 cURL 扩展,支持通过多种协议(如 HTTP、FTP)进行网络数据传输,常用于发送 HTTP 请求。
  • --enable-ftp:开启 FTP 支持,让 PHP 可以通过 FTP 协议上传和下载文件。
  • --enable-sockets:开启套接字支持,可用于创建网络服务器和客户端。

7.字符串处理相关

  • --enable-mbregex--enable-mbstring:mbstring 扩展用于处理多字节字符串,mbregex 支持多字节正则表达式。

8.加密相关

  • --with-mcrypt:启用 mcrypt 扩展,用于数据加密和解密。
  • --with-openssl:启用 OpenSSL 扩展,支持 SSL/TLS 加密协议,保障网络通信安全。
  • --with-mhash:启用 mhash 扩展,用于计算数据的哈希值。

8.进程控制和 Web 服务相关

  • --enable-pcntl:启用进程控制扩展,允许 PHP 创建和控制子进程。
  • --with-xmlrpc:启用 XML - RPC 扩展,用于实现基于 XML 的远程过程调用。
  • --enable-zip:允许 PHP 创建和操作 ZIP 压缩文件。
  • --enable-soap:启用 SOAP 扩展,用于创建和使用 SOAP Web 服务。

9.国际化和性能优化相关

  • --with-gettext:启用 gettext 扩展,用于实现国际化和本地化功能。
  • --enable-opcache:开启操作码缓存,避免 PHP 脚本重复编译,提高执行速度。
  • --enable-intl:启用国际化扩展,支持日期、时间、数字等的本地化处理。
  • --with-xsl:启用 XSLT 扩展,用于将 XML 数据转换为其他格式。

10.其他

  • --disable-rpath:禁止在编译时使用 rpath,避免运行时动态链接库搜索路径问题。
  • --enable-inline-optimization:开启内联优化,提高代码执行效率。

还有一个是安装时--with-php-config这个参数要指定给你安装php时的目录这个是不能错的,不然编译的时候会找不到对应的目录,安装php7版本的时候要设置,5.6也设置了,但好像未生效,不知道是什么原因导致的。

shell 复制代码
./configure --prefix=/usr/local/php56 \
--with-fpm-user=www \
--with-fpm-group=www \
--enable-fpm \
--with-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-iconv-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--enable-xml \
--disable-rpath \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--with-curl \
--enable-mbregex \
--enable-mbstring \
--with-mcrypt \
--enable-ftp \
--with-gd \
--enable-gd-native-ttf \
--with-openssl \
--with-mhash \
--enable-pcntl \
--enable-sockets \
--with-xmlrpc \
--enable-zip \
--enable-soap \
--with-gettext \
--enable-opcache \
--enable-intl \
--with-xsl 

安装成功,执行 make && make install 编译的时间有点慢,需要耐心等待安装成功,下面的四个变量是安装的灵魂,一定要牢记。

shell 复制代码
/usr/local/php56/bin/php # php cli 路径
/usr/local/php56/sbin/php-fpm # php php-fpm 路径
/usr/local/php56/bin/phpize # phpize 路径
/usr/local/php56/bin/php-config
/usr/local/php56/bin/pecl #安装扩展时使用

配置文件

在安装目录 需要手动复制配置文件,主要有两个,一个是php.ini,一个是php-fpm.conf

shell 复制代码
cp /usr/local/soft/php-5.6.37/php.ini-development /usr/local/php56/etc/php.ini
cp /usr/local/php56/etc/php-fpm.conf.default /usr/local/php56/etc/php-fpm.conf

修改php-fpm监听端口9001,端口数是自定义的,用于与Nginx通信时进行监听,启动php-fpm服务:

shell 复制代码
listen = 127.0.0.1:9001

/usr/local/php56/sbin/php-fpm  -y /usr/local/php56/etc/php-fpm.conf -c /usr/local/php56/etc/php.ini

本地的版本兼容问题,产生错误信息如下:

shell 复制代码
Deprecated: Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a future version. To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead. in Unknown on line 0

现在服务器的进程上已经显示有两个不同的版本php-fpm在运行了。

shell 复制代码
[root@iZ2zed473b1ok8pmcvvuv1Z php-5.6.37]# pstree -p -a | grep php-fpm
  |-php-fpm,1890
  |   |-php-fpm,1891
  |   `-php-fpm,1892
  |-php-fpm,15644
  |   |-php-fpm,15645
  |   |-php-fpm,15646
  |   |-php-fpm,15647
  |   |-php-fpm,15648
  |   `-php-fpm,15649
  |           |-grep,1929 --color=auto php-fpm

安装扩展

之前都是使用编译的方式来安装扩展,但我发现推荐pecl方式更加简单实用,使用pecl方式,出现Build process completed successfully代表扩展已经安装成功了。

shell 复制代码
/usr/local/php56/bin/pecl install redis-2.2.8

每个扩展都是根据PHP版本的兼容性进行安装的,验证一下是否安装成功:

shell 复制代码
[root@iZ2zed473b1ok8pmcvvuv1Z ~]# /usr/local/php56/bin/pecl list
Installed packages, channel pecl.php.net:
=========================================
Package Version State
redis   2.2.8   stable

Nginx 调用

Nginx在与php-fpm进行通信的时候,使用那个版本就在fastcgi_pass监听那个端口的php-fpm实例即可。

shell 复制代码
     location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9001;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_index  index.php;
        include        fastcgi.conf;
        client_max_body_size 8096M;
    }

问题及解决

yum源安装

在安装php 5.6版本的时候遇到了一个如下问题,大概是yum源的安装出现了问题,把源改成国内就好了。

shell 复制代码
[root@iZ2zed473b1ok8pmcvvuv1Z redis-3.1.6]# yum install -y gcc make php-devel php-pear autoconf automake
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
Could not retrieve mirrorlist http://mirrorlist.centos.org?arch=x86_64&release=7&repo=sclo-rh error was
14: curl#6 - "Could not resolve host: mirrorlist.centos.org; 未知的错误"

1. 备份原有仓库文件

shell 复制代码
mkdir -p /etc/yum.repos.d/backup
mv /etc/yum.repos.d/CentOS-*.repo /etc/yum.repos.d/backup/

2. 下载国内镜像源配置文件

shell 复制代码
# 阿里云镜像
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

# 腾讯云镜像
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/CentOS-Base.repo

# 使用华为云镜像源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://repo.huaweicloud.com/repository/conf/CentOS-7-reg.repo

3. 清理并重建YUM缓存

shell 复制代码
yum clean all        # 清理旧缓存
yum makecache        # 生成新缓存
yum repolist         # 检查仓库列表

4.验证新源是否生效

shell 复制代码
yum update -y        # 测试更新(可选)

编译软件

编译过程中遇到了make: *** No targets specified and no makefile found. Stop., 报错 configure: error: xml2-config not found. Please check your libxml2 installation.,缺少编译软件。缺少编译所需要的软件。

shell 复制代码
yum -y install gcc gcc-c++ autoconf \
automake zlib zlib-devel \
openssl openssl-devel  \
pcre pcre-devel libxml2 \
libxml2-devel sqlite-devel -y
相关推荐
石榴树下3 分钟前
00. 马里奥的 OAuth 2 和 OIDC 历险记
后端
uhakadotcom4 分钟前
开源:subdomainpy快速高效的 Python 子域名检测工具
前端·后端·面试
似水流年流不尽思念20 分钟前
容器化技术了解吗?主要解决什么问题?原理是什么?
后端
Java水解22 分钟前
Java中的四种引用类型详解:强引用、软引用、弱引用和虚引用
java·后端
i听风逝夜22 分钟前
看好了,第二遍,SpringBoot单体应用真正的零停机无缝更新代码
后端
柏油1 小时前
可视化 MySQL binlog 监听方案
数据库·后端·mysql
舒一笑2 小时前
Started TttttApplication in 0.257 seconds (没有 Web 依赖导致 JVM 正常退出)
jvm·spring boot·后端
M1A12 小时前
Java Enum 类:优雅的常量定义与管理方式(深度解析)
后端
AAA修煤气灶刘哥2 小时前
别再懵了!Spring、Spring Boot、Spring MVC 的区别,一篇讲透
后端·面试
全栈软件开发3 小时前
PHP域名授权系统网站源码_授权管理工单系统_精美UI_附教程
开发语言·ui·php·php域名授权·授权系统网站源码