前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >PHP多版本共存终极填坑指南:一台服务器部署多实例的最佳实践

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

原创
作者头像
stark张宇
发布于 2025-03-22 11:45:31
发布于 2025-03-22 11:45:31
1540
举报
文章被收录于专栏:stark张宇stark张宇

概述

本文针对中小企业在同一台服务器上同时维护多个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
AI代码解释
复制
# 下载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
AI代码解释
复制
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
AI代码解释
复制
./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
AI代码解释
复制
/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
AI代码解释
复制
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
AI代码解释
复制
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
AI代码解释
复制
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
AI代码解释
复制
[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
AI代码解释
复制
/usr/local/php56/bin/pecl install redis-2.2.8

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

代码语言:shell
AI代码解释
复制
[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
AI代码解释
复制
     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
AI代码解释
复制
[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
AI代码解释
复制
mkdir -p /etc/yum.repos.d/backup
mv /etc/yum.repos.d/CentOS-*.repo /etc/yum.repos.d/backup/

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

代码语言:shell
AI代码解释
复制
# 阿里云镜像
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
AI代码解释
复制
yum clean all        # 清理旧缓存
yum makecache        # 生成新缓存
yum repolist         # 检查仓库列表

4.验证新源是否生效

代码语言:shell
AI代码解释
复制
yum update -y        # 测试更新(可选)
编译软件

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

代码语言:shell
AI代码解释
复制
yum -y install gcc gcc-c++ autoconf \
automake zlib zlib-devel \
openssl openssl-devel  \
pcre pcre-devel libxml2 \
libxml2-devel sqlite-devel -y

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Linux部署网站(Nginx+PHP+MySQL)
做好网站部署前期准备,购买域名、服务器、备案等工作(如果是学习需要,可以使用虚拟机),在服务器上使用Nginx、PHP、MySQL官方网站提供的源码包进行本地编译安装。安装完成之后对各软件进行配置、修改配置文件等工作,以及对服务器安全进行配置,如打开防火墙,开放相关端口等,保证各软件、各模块之间能够互相配合,支持网站各项功能正常使用。最后进行网站源代码和编写和上传工作。
Cikian.
2023/01/08
2.6K0
Linux部署网站(Nginx+PHP+MySQL)
centos7.4安装LNMP
系统最小化安装,只安装了一些常用包(vim、lirzs、gcc*、wget、bash-completion)
萧晚歌
2020/08/19
9440
Zabbix4.2安装和4.0升级4.2笔记
Server和ServerActive分别代表zabbix的被动模式和主动模式,这里都填server端的IP 最后一行是开启脚本采集数据
没有故事的陈师傅
2019/07/27
9980
使用 Dockerfile 构建 php7.4 centos 容器
dockerhub 官网提供了 php7.4 fpm 官方镜像(参见 https://hub.docker.com/_/php/tags?page=1&name=7.4-fpm-alpine),其中有 alpine 版本只要几十兆,但这样的镜像基础工具很少,项目内需安装一些额外扩展还是很费劲,本着简单实用原则,自己编写了下述 Dockerfile 便于快速创建出基于 centos 系统的 php docker 环境并支持 ssh 登录
lukachen
2023/10/22
1.1K0
配置nginx + php7 + mongodb的centos服务器环境
重构、重构、重构 大三下学期了,面试某公司,结果连技术面都没过,╮(╯▽╰)╭,还是有一点打击的。不过也有打算重构一下两个小项目的,希望以此叩开实习的大门。记录一下全过程! 重构前 这部分主要是服务器的搭建。 之前Github学生认证,送了DigitalOcean 100刀,买了一台位于新加坡节点的512 MB Memory / 20 GB Disk / SGP1 - CentOS 6.7 x64 编译nginx mongodb … 前的准备 yum updateyum install wget gcc g
许杨淼淼
2018/07/11
9110
02.docker镜像制作
基于centos7制作docker镜像 docker镜像是企业非常常用的一种应用打包,应用交付的方式. docker天生优势,一处构建处处运行,在任何机器构建的服务均可以在任意一台安装有docker的主机上运行 1. docker构建nginx镜像 1. 首先安装centos7平台环境 docker run -itd --name centos7 cenots:7 docker run -it --name centos7 centos:7 2. 进入cenots7 docker exec -it cen
陈雷雷
2020/03/18
1.4K0
02.docker镜像制作
Centos7 mini 配置 php7+nginx+mysql 最详细过程,为linux小白送福利
本来不想写这篇的,因为网上都有,但是最近问关于这些环境配置的朋友有点多,于是整理一番,全部都是本人实战验证过的。
躺平程序员老修
2023/09/05
4330
Centos7 mini 配置 php7+nginx+mysql 最详细过程,为linux小白送福利
PHP常见错误解决方案
使用phpize为PHP动态添加扩展时,报Cannot find autoconf错误 解决方案 $ /app/php/bin/phpize Configuring for: PHP Api Version: 20170718 Zend Module Api No: 20170718 Zend Extension Api No: 320170718 Cannot find autoconf. Please check your a
用户1456517
2019/03/05
1.7K0
部署lamp-php安装指南
PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。PHP 独特的语法混合了C、Java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。
星哥玩云
2022/09/15
1K0
CentOS 7 编译安装 PHP 7.4
yum install gd zlib zlib-devel openssl openssl-devel libxml2 libxml2-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libmcrypt libmcrypt-devel
用户10063859
2022/09/23
9480
centos6新系统初始化脚本
最近装机次数有点多,本来想写到这里的centos6 优化脚本与安全脚本,结果一想还是新开一个帖子吧。
老高的技术博客
2022/12/28
5220
centos7源码部署php7.1
1.安装依赖 yum -y install gcc make gcc-c++ php-mcrypt libmcrypt libmcrypt-devel autoconf freetype gd jpegsrc libmcrypt libpng libpng-devel libjpeg libxml2 libxml2-devel zlib curl curl-devel
陈不成i
2021/06/29
2930
从centos裸机一步一步搭建完整的PHP环境
购买服务器:在阿里云上注册账号,如果是学生的话可以买学生套餐,否则买正常的。在用户面板会得到一个密码,用户名默认为root。这个密码是可以修改的。同时会获得一个公网的IP。 非常重要的就是修改完密码要重启一下服务器。 登陆服务器:在terminal执行ssh root@公网IP( ssh root@42.96.142.34),提示输入密码,输入之后登陆上。 登录后yum update 配置私钥免登录:如果电脑在已经有了.ssh目录下已经有了.pub文件,那就直接使用即可,没有的话把生成一个公钥和私钥(ssh
botkenni
2021/07/27
4380
基于Dockerfile构建LNMP环境(PHP7+MySQL+Nginx)
经几个星期反复测试总结出了整个lnmp环境的Dockerfile文件,并已经适用于公司开发环境中。
星哥玩云
2022/07/19
8840
CentOS 7 安装 PHP 7.4.0 正式版
wget https://www.php.net/distributions/php-7.4.0.tar.bz2 tar -jxf php-7.4.0.tar.bz2 cd php-7.4.0 3、配置并构建 PHP。在此步骤您可以使用很多选项自定义 PHP,例如启用某些扩展等。 运行 ./configure –help 命令来获得完整的可用选项清单。 在本示例中,我们仅进行包含 PHP-FPM 和 MySQL 支持的简单配置。
Alone88
2020/09/01
2.8K0
CentOS下Nginx+PHP7 安装及配置
yum install pcre pcre-devel openssl openssl-devel -y
星哥玩云
2022/07/19
4390
制作nginx+php的docker镜像及其使用技巧
  docker镜像的制作有2种方法,一种是启动一个容器并在容器里操作,再将容器提交为一个新的镜像;一种是写Dockerfile,然后执行dockerfile由docker给我们一步步自动生成新的镜像;显然第二种方法更高大上,也更适合容器需要不断版本更替的场景。本人在安装nginx和php的时候,更习惯自己下载源码编译安装,所以编译安装这里写Dockerfile实在是繁琐,而且nginx+php并不是需要频发更替版本,通常在制作容器前,跟开发确定好版本号,制作好容器可以一直使用;所以以下的操作,前半部分,nginx和php的安装在容器里操作;最后让nginx和php同时启动起来则是写了一个Dockerfile。
菲宇
2019/06/12
2.9K1
手动编译安装php、nginx
以往都是使用 lnmp 一键安装包,进行开发环境的搭建,这两天自己手动编译安装php、nginx使其能成功打印出 
lukachen
2023/10/22
3520
centos6.8下配置lamp
一、系统环境 系统平台:CentOS 6.8 64位 Apache版本: httpd-2.4.25.tar.gz MySQL版本: mysql-5.7.18.tar.gz PHP版本: php-7.1.4.tar.gz phpMyAdmin版本:phpMyAdmin-4.7.0-all-languages.tar.gz 二、安装前准备 在安装PHP之前,应先安装PHP需要的最新版本库文件,例如libxml2、libmcrypt以及GD2库等文件。安装GD2库是为了让PHP支持GIF、PNG和JPEG等图片格式,所以在安装GD2库之前还要先安装最新的zlib、libpng、freetype和jpegsrc等库文件。而且整个环境的搭建中还会穿插安装一些扩展和软件,可按照步骤安装。 1、准备所需库文件(有的安装了后面也没用,但是统统安装吧) autoconf-2.69.tar.gz freetype-2.7.1.tar.gz libgd-2.1.0.tar.gz jpegsrc.v9.tar.gz libmcrypt-2.5.8.tar.gz libpng-1.6.29.tar.gz libxml2-2.7.8.tar.gz zlib-1.2.11.tar.gz apr-1.5.2.tar.gz apr-util-1.5.4.tar.gz pcre-8.40.tar.gz curl-7.54.0.tar.gz 2、安装系统所需依赖库(由于在后面的安装过程中遇到很多缺少依赖的问题,所以现在整理了一下,集中在这一步安装) yum -y install gcc gcc-c++ gcc-g77 make cmake bison ncurses-devel autoconf automake zlib* fiex* libxml* libmcrypt* libtool-ltdl-devel* libaio libaio-devel bzr libtool ncurses5-devel imake libxml2-devel expat-devel 3、卸载之前安装的旧版本环境 a、使用yum remove xxxx命令 b、使用rpm -e xxxx命令 c、删除相关文件rm -rf xxxx
botkenni
2019/09/02
1K0
相关推荐
Linux部署网站(Nginx+PHP+MySQL)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文