概述
本文针对中小企业在同一台服务器上同时维护多个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