一、概述
本文聚焦于中小企业在同一服务器上维护多个PHP版本(如5.5、5.6、7.4等)的实际需求,精心构建了一套完整的解决方案体系。从不同版本PHP的源码编译安装,到多实例php - fpm的独立配置(涵盖端口隔离、用户权限管理等关键环节),再到Nginx集成、Redis扩展安装以及常见编译问题的修复,全方位攻克了部署过程中的核心难点。文章以CentOS 7.8环境为示例,深度结合实战场景,对编译参数优化、依赖项配置、Yum源加速等关键操作进行了细致入微的解析,助力开发者有效规避版本冲突、依赖缺失等棘手问题,达成老旧项目与新技术栈的和谐共生。
环境部署痛点
不少PHP开发者,尤其是中小企业的后端工程师,想必都遭遇过这样的困境:同一台服务器上同时运行着多个不同版本的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版本,其对应URL分别为https://www.php.net/distributions/php - 5.6.37.tar.gz
和https://www.php.net/distributions/php - 7.4.28.tar.gz
。
在服务器上新建一个文件夹用于存放源码包,如/usr/local/soft
。以下为下载并解压5.6.37版本源码包的操作示例:
# 下载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
,该设置需与下一步编译时保持一致,后续操作均以此设置为准。
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
,此路径将用于存放PHP安装后的各类文件,方便管理与维护。--with-fpm-user=www
和--with-fpm-group=www
:设定PHP - FPM进程运行时所使用的用户和用户组为www
。合理设置运行用户和用户组,有助于保障PHP - FPM进程的安全性与稳定性,同时与服务器整体权限体系相适配。--enable-fpm
:启用FastCGI进程管理器(FPM)。FPM在处理PHP请求方面表现卓越,尤其适用于高并发场景,能够显著提升服务器对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图像的能力,使PHP程序可以对这些常见格式的图像进行读取、编辑、生成等操作,满足诸如图片上传、处理、展示等业务场景的需求。--with-gd
和--enable-gd-native-ttf
:启用GD库,该库是PHP图像处理的核心组件之一,能够实现多种图像处理功能,如裁剪、缩放、添加文字等。--enable-gd-native-ttf
参数则进一步支持在图像中使用TrueType字体,使得在图像上添加文字时能够呈现出丰富多样的字体效果。
4. 数据压缩和XML处理相关
--with-zlib
:启用zlib扩展,此扩展主要用于数据的压缩和解压缩操作。在网络数据传输和存储过程中,通过zlib扩展对数据进行压缩,可以有效减小数据体积,降低网络带宽消耗,提高数据传输效率和存储利用率。--enable-xml
:开启对XML的支持,使PHP具备解析和生成XML数据的能力。在当今的Web开发中,XML常用于数据交换、配置文件存储以及与各类Web服务进行交互,因此PHP对XML的良好支持至关重要,能够满足多样化的业务需求。
5. 数学运算和内存管理相关
--enable-bcmath
:启用任意精度数学运算扩展,该扩展专门用于处理大数字的高精度计算。在一些涉及金融计算、科学计算等对数字精度要求极高的场景中,bcmath
扩展能够确保计算结果的准确性,避免因浮点数运算精度问题导致的数据错误。--enable-shmop
:启用共享内存操作扩展,它支持在多个进程间共享数据。通过共享内存,不同进程可以快速高效地访问和修改相同的数据区域,减少数据复制开销,提高进程间通信和协作的效率,适用于需要频繁进行数据共享和交互的应用场景。--enable-sysvsem
:启用系统V信号量支持,信号量是进程间同步和互斥的重要机制。在多进程并发执行的环境中,通过系统V信号量可以有效控制多个进程对共享资源的访问顺序,防止数据竞争和不一致问题的发生,保障系统的稳定性和正确性。
6. 网络相关
--with-curl
:启用cURL扩展,该扩展支持通过多种网络协议(如HTTP、FTP等)进行网络数据传输。在Web开发中,经常需要与外部服务器进行数据交互,例如发送HTTP请求获取数据、上传文件到FTP服务器等,cURL扩展提供了便捷且功能强大的方式来实现这些网络操作。--enable-ftp
:开启FTP支持,使得PHP能够通过FTP协议进行文件的上传和下载操作。这在一些需要与FTP服务器进行文件交互的业务场景中非常实用,比如网站文件备份、文件资源共享等。--enable-sockets
:开启套接字支持,套接字是网络编程的基础工具,通过套接字,PHP可以创建网络服务器和客户端,实现基于TCP/IP等协议的网络通信功能,为开发各种网络应用提供了底层支持。
7. 字符串处理相关
--enable-mbregex
和--enable-mbstring
:mbstring
扩展专注于处理多字节字符串,在全球化应用中,不同语言的字符串可能包含多种字符编码,mbstring
扩展能够正确识别和处理这些多字节字符串,避免因字符编码问题导致的字符串处理错误。mbregex
则进一步支持多字节正则表达式,使得在处理多字节字符串时能够进行更复杂、灵活的模式匹配操作。
8. 加密相关
--with-mcrypt
:启用mcrypt扩展,该扩展主要用于数据的加密和解密操作。在保护敏感数据安全方面,mcrypt扩展提供了多种加密算法,开发者可以根据实际需求选择合适的算法对数据进行加密处理,确保数据在传输和存储过程中的保密性。--with-openssl
:启用OpenSSL扩展,OpenSSL是一个广泛使用的开源加密库,支持SSL/TLS加密协议。在网络通信中,通过OpenSSL扩展启用SSL/TLS加密,可以保障数据在传输过程中的安全性,防止数据被窃取或篡改,常用于构建安全的Web服务器和客户端。--with-mhash
:启用mhash扩展,该扩展用于计算数据的哈希值。哈希值在数据完整性校验、密码存储等方面有着广泛应用,通过计算数据的哈希值,可以快速验证数据在传输或存储过程中是否发生了变化,同时在存储用户密码时,使用哈希值可以提高密码的安全性。
9. 进程控制和Web服务相关
--enable-pcntl
:启用进程控制扩展,此扩展允许PHP创建和控制子进程。在一些复杂的业务场景中,需要通过多进程并发执行来提高系统性能和处理效率,pcntl
扩展提供了创建、管理子进程的功能,使得PHP能够像其他系统编程语言一样进行进程级别的控制和调度。--with-xmlrpc
:启用XML - RPC扩展,用于实现基于XML的远程过程调用。XML - RPC是一种远程调用协议,允许不同系统之间通过HTTP等协议进行过程调用,就像调用本地函数一样。通过xmlrpc
扩展,PHP应用程序可以方便地与其他支持XML - RPC协议的系统进行交互,实现分布式系统的功能集成。--enable-zip
:允许PHP创建和操作ZIP压缩文件。在文件管理和数据传输过程中,ZIP格式的压缩文件被广泛应用,通过enable-zip
参数启用相关功能,PHP程序可以实现对ZIP文件的创建、解压、添加文件等操作,满足文件压缩归档和分发的需求。--enable-soap
:启用SOAP扩展,SOAP是一种基于XML的Web服务协议,用于在不同的应用程序之间进行通信。通过enable-soap
参数,PHP可以创建和使用SOAP Web服务,使得不同平台、不同编程语言开发的应用程序能够通过标准的SOAP协议进行数据交换和功能调用,促进了企业级应用系统之间的集成和互操作性。
10. 国际化和性能优化相关
--with-gettext
:启用gettext扩展,该扩展主要用于实现国际化和本地化功能。在开发面向全球用户的应用程序时,需要根据不同地区用户的语言和文化习惯展示相应的界面和内容,gettext
扩展提供了一套完整的机制来实现多语言支持,通过在代码中合理使用gettext
函数,可以轻松实现应用程序的国际化和本地化部署。--enable-opcache
:开启操作码缓存,PHP脚本在执行过程中需要先进行编译,将PHP代码转换为操作码。开启操作码缓存后,PHP会将编译后的操作码缓存起来,下次执行相同脚本时直接从缓存中读取操作码,避免了重复编译过程,大大提高了PHP脚本的执行速度,尤其在高并发访问场景下,能够显著提升服务器的性能和响应速度。--enable-intl
:启用国际化扩展,该扩展提供了丰富的功能支持日期、时间、数字等的本地化处理。在全球化应用中,不同地区对于日期、时间、数字的显示格式和习惯各不相同,intl
扩展能够根据用户所在地区的设置,自动将这些数据按照当地习惯进行格式化和显示,提升用户体验。--with-xsl
:启用XSLT扩展,用于将XML数据转换为其他格式。XSLT(Extensible Stylesheet Language Transformations)是一种用于转换XML文档的语言,通过with-xsl
参数启用相关功能,PHP可以利用XSLT样式表对XML数据进行转换,例如将XML数据转换为HTML格式用于网页展示,或者转换为其他特定格式以满足不同业务需求。
11. 其他
--disable-rpath
:禁止在编译时使用rpath,rpath是运行时动态链接库搜索路径。在某些情况下,使用rpath可能会导致运行时动态链接库搜索路径出现问题,通过--disable-rpath
参数可以避免此类问题的发生,确保程序在运行时能够正确找到所需的动态链接库。--enable-inline-optimization
:开启内联优化,内联优化是一种编译器优化技术,它将一些短小的函数调用替换为函数体的代码,减少函数调用的开销,从而提高代码的执行效率。在PHP源码编译过程中开启内联优化,有助于提升PHP程序的整体性能。
另外,在安装时,--with-php-config
这个参数需要指定为安装php时的目录,这一点至关重要,若设置错误,在编译时将无法找到对应的目录。在安装php7版本时需正确设置该参数,对于php5.6版本,虽进行了设置,但似乎并未生效,具体原因尚未明确。
./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
命令进行编译和安装。由于编译过程涉及大量代码的编译和链接操作,所需时间较长,需要耐心等待直至安装成功。以下四个变量在安装过程中具有关键作用,务必牢记:
/usr/local/php56/bin/php # php cli路径,用于在命令行环境下执行PHP脚本
/usr/local/php56/sbin/php-fpm # php php-fpm路径,PHP - FPM进程的启动和管理命令所在位置
/usr/local/php56/bin/phpize # phpize路径,用于生成PHP扩展的配置文件,方便后续编译和安装扩展
/usr/local/php56/bin/php-config # 用于获取PHP安装的相关配置信息,在编译某些依赖PHP配置的软件或扩展时会用到
/usr/local/php56/bin/pecl # 安装扩展时使用,通过pecl(PHP Extension Community Library)可以方便地搜索、下载和安装各种PHP扩展
配置文件
在安装目录中,需要手动复制两个关键的配置文件,分别为php.ini和php - fpm.conf 。具体操作如下:
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服务,具体命令如下:
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
在本地环境中,因版本兼容性问题,可能会出现如下错误信息:
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在运行。具体查看命令及结果如下:
[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
提示,则表明扩展已安装成功。例如,安装redis扩展(版本为2.2.8)的命令如下:
/usr/local/php56/bin/pecl install redis - 2.2.8
需注意的是,每个扩展的安装都需考虑其与PHP版本的兼容性。安装完成后,可通过以下命令验证扩展是否安装成功:
[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进行通信时,若要使用特定版本的php - fpm,只需在fastcgi_pass
指令中监听对应端口的php - fpm实例即可。以下是Nginx配置文件中相关的示例配置:
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源安装环节出现异常。将yum源更换为国内源后,问题得以解决。当时遇到的报错信息如下:
[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. 备份原有仓库文件
为防止后续操作失误导致无法恢复,首先对原有仓库文件进行备份。执行以下命令,将CentOS相关的仓库文件备份至指定目录:
mkdir -p /etc/yum.repos.d/backup
mv /etc/yum.repos.d/CentOS-*.repo /etc/yum.repos.d/backup/
2. 下载国内镜像源配置文件
可根据自身需求选择国内的镜像源,以下为常见国内镜像源的下载命令:
# 阿里云镜像
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缓存
更换源后,需清理旧的缓存并重新生成缓存,同时检查仓库列表,确保新源配置生效。执行以下命令:
yum clean all # 清理旧缓存
yum makecache # 生成新缓存
yum repolist # 检查仓库列表
4. 验证新源是否生效
可通过执行系统更新命令来验证新源是否正常工作(此步骤为可选操作):
yum update -y # 测试更新
编译软件缺失问题
在编译过程中,遇到了报错 make: *** No targets specified and no makefile found. Stop.
以及 configure: error: xml2-config not found. Please check your libxml2 installation.
,这是由于缺少编译所需的软件。为解决该问题,需安装一系列编译依赖软件,执行以下命令进行安装:
yum -y install gcc gcc-c++ autoconf \
automake zlib zlib-devel \
openssl openssl-devel \
pcre pcre-devel libxml2 \
libxml2-devel sqlite-devel -y
安装完成这些依赖软件后,通常可顺利解决编译过程中因软件缺失导致的报错问题,确保编译工作能够正常进行。
总结
本文围绕中小企业在CentOS 7.8服务器上维护多个PHP版本的需求展开,从源码编译安装不同PHP版本开始,详细阐述了php - fpm多实例配置、Nginx集成以及Redis扩展安装等关键环节的操作步骤与技术要点。同时,针对安装过程中可能出现的如yum源安装失败、编译软件缺失等问题,提供了清晰且详细的解决方案。通过完整的流程解析与问题应对策略,帮助开发者顺利完成PHP多版本环境搭建,实现老旧项目与新技术栈的兼容与共存。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。
文章由技术书栈整理,本文链接:https://study.disign.me/article/202513/1.php-many-version.md
发布时间: 2025-03-26