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
相关推荐
Asthenia04124 分钟前
面试官问我怎么做分库分表?这是一份全面的实战解答
后端
小兵张健33 分钟前
运用 AI,看这一篇就够了(上)
前端·后端·cursor
Asthenia041237 分钟前
使用RocketMQ的本地消息表+事务消息/普通消息方案实现分布式事务
后端
QQ828929QQ1 小时前
Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实战指南
java·spring boot·后端
Asthenia04122 小时前
Emoji表情包如何实现跨平台兼容:从QQ、微信到网易云
后端
思无邪66752 小时前
golang Error的一些坑
后端
捡田螺的小男孩2 小时前
腾讯一面:40亿QQ号,不超过1G内存,如何去重?
java·后端·面试
Asthenia04122 小时前
从 Servlet 到 WebMvcConfigurer:Java Web 与 Spring Boot 的进阶之旅
后端
Asthenia04123 小时前
Fail-Fast vs Fail-Safe / hashCode & equals / finalize / Exception变化 / System.gc
后端
菜萝卜子3 小时前
【Go 】Go 语言中的 channel介绍
开发语言·后端·golang