头图

CentOS系统上编译安装PHP并实现多版本切换,是一项需要扎实的Linux编程基础的任务。通过合理的配置,您可以在同一台服务器上运行多个PHP版本,以满足不同项目的需求。以下是详细的步骤指南,涵盖从环境准备到PHP版本切换的全过程,确保您能够顺利完成安装并高效管理多个PHP版本。

目录 📚

  1. 前提条件
  2. 安装必要的开发工具和库
  3. 下载和解压PHP源码
  4. 配置PHP编译选项
  5. 编译和安装PHP
  6. 配置PHP-FPM
  7. 配置Web服务器使用PHP-FPM
  8. 实现PHP多版本切换
  9. 常见问题与解决方案
  10. 工作流程图
  11. 重要命令汇总
  12. 注意事项
  13. 总结

前提条件 🔍

在开始之前,请确保您的CentOS系统满足以下条件:

  • 操作系统:CentOS 7 或 CentOS 8
  • 处理器架构:x86_64
  • 内存:至少4GB,推荐8GB以上
  • 存储空间:至少20GB,用于PHP源码和相关依赖
  • 网络连接:稳定的互联网连接,用于下载源码和依赖

安装必要的开发工具和库 🛠️

首先,需要安装编译PHP所需的开发工具。这包括编译器、依赖库等。

1. 更新系统包索引

sudo yum update -y

解释

  • sudo:以超级用户权限运行命令。
  • yum update -y:更新系统中的所有软件包到最新版本,-y自动确认。

2. 安装开发工具组

sudo yum groupinstall 'Development Tools' -y

解释

  • yum groupinstall 'Development Tools':安装一组常用的开发工具,包括GCC编译器、make工具等。
  • -y:自动确认安装。

3. 安装必要的库和依赖

sudo yum install -y libxml2-devel openssl-devel curl-devel libjpeg-devel libpng-devel freetype-devel bzip2-devel libmcrypt-devel libicu-devel libxslt-devel

解释

  • libxml2-devel:XML解析库开发文件。
  • openssl-devel:OpenSSL库开发文件,用于支持HTTPS等功能。
  • curl-devel:cURL库开发文件,用于HTTP请求。
  • libjpeg-devellibpng-develfreetype-devel:图像处理相关库开发文件。
  • bzip2-devel:bzip2压缩库开发文件。
  • libmcrypt-devel:加密库开发文件。
  • libicu-devel:国际化支持库开发文件。
  • libxslt-devel:XSLT处理库开发文件。

下载和解压PHP源码 📥

接下来,您需要从PHP官方网站下载所需的PHP版本源码,并进行解压。

1. 下载PHP源码

假设您需要安装PHP 7.4,可以使用以下命令:

wget https://www.php.net/distributions/php-7.4.0.tar.gz

解释

  • wget:命令行下载工具。
  • https://www.php.net/distributions/php-7.4.0.tar.gz:PHP 7.4.0版本的源码压缩包链接。

2. 解压源码包

tar -zxvf php-7.4.0.tar.gz
cd php-7.4.0

解释

  • tar -zxvf:解压.tar.gz压缩包。

    • -z:通过gzip解压。
    • -x:解包。
    • -v:显示解压过程。
    • -f:指定文件名。
  • cd php-7.4.0:进入解压后的源码目录。

配置PHP编译选项 ⚙️

在编译PHP之前,需要配置编译选项,以启用所需的功能和模块。

1. 运行配置命令

./configure --prefix=/usr/local/php74 \
--with-config-file-path=/usr/local/php74/etc \
--with-mysqli \
--with-pdo-mysql \
--with-openssl \
--with-curl \
--with-zlib \
--with-libxml-dir=/usr \
--enable-mbstring \
--enable-sockets \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--enable-opcache \
--enable-bcmath \
--enable-soap \
--enable-zip \
--enable-fpm \
--with-fpm-user=www \
--with-fpm-group=www

解释

选项说明
--prefix=/usr/local/php74指定PHP安装目录为/usr/local/php74,便于管理不同版本。
--with-config-file-path=/usr/local/php74/etc指定php.ini配置文件路径。
--with-mysqli--with-pdo-mysql启用MySQLi和PDO MySQL扩展,用于数据库连接。
--with-openssl启用OpenSSL支持,确保安全通信。
--with-curl启用cURL扩展,支持HTTP请求。
--with-zlib启用zlib压缩支持。
--with-libxml-dir=/usr指定libxml目录,支持XML解析。
--enable-mbstring启用多字节字符串支持,处理非ASCII字符。
--enable-sockets启用套接字支持,进行网络编程。
--with-gd--with-jpeg-dir--with-png-dir--with-freetype-dir启用GD库及其相关图像处理扩展。
--enable-opcache启用OPcache,提高PHP性能。
--enable-bcmath启用BCMath扩展,支持高精度数学运算。
--enable-soap启用SOAP扩展,支持SOAP协议。
--enable-zip启用ZIP扩展,处理ZIP文件。
--enable-fpm启用PHP-FPM,处理高并发请求。
--with-fpm-user=www--with-fpm-group=www指定PHP-FPM运行的用户和组。

2. 根据需求调整配置

如果需要启用其他功能或模块,可以在配置命令中添加相应的选项。例如,启用Redis扩展:

--with-redis

编译和安装PHP 💻

配置完成后,开始编译和安装PHP。

1. 编译PHP

make

解释

  • make:根据Makefile编译源码,生成可执行文件和扩展。

说明

  • 编译过程可能需要几分钟,具体取决于系统性能。

2. 安装PHP

sudo make install

解释

  • sudo make install:以超级用户权限将编译后的文件安装到指定的目录(--prefix指定的目录)。

说明

  • 安装过程将生成PHP可执行文件、配置文件和相关库。

配置PHP-FPM 📝

安装完成后,需要配置PHP-FPM,以便Web服务器能够与PHP通信。

1. 复制默认配置文件

cp /usr/local/php74/etc/php-fpm.conf.default /usr/local/php74/etc/php-fpm.conf
cp /usr/local/php74/etc/php-fpm.d/www.conf.default /usr/local/php74/etc/php-fpm.d/www.conf

解释

  • cp:复制文件。
  • /usr/local/php74/etc/php-fpm.conf.default/usr/local/php74/etc/php-fpm.conf:复制默认的PHP-FPM配置文件。
  • /usr/local/php74/etc/php-fpm.d/www.conf.default/usr/local/php74/etc/php-fpm.d/www.conf:复制默认的PHP-FPM池配置文件。

2. 编辑PHP-FPM配置文件

nano /usr/local/php74/etc/php-fpm.conf

关键配置

[global]
pid = /usr/local/php74/var/run/php-fpm.pid
error_log = /usr/local/php74/var/log/php-fpm.log
include=/usr/local/php74/etc/php-fpm.d/*.conf

解释

  • pid:指定PHP-FPM进程ID文件位置。
  • error_log:指定错误日志文件位置。
  • include:包含池配置文件。

3. 编辑PHP-FPM池配置

nano /usr/local/php74/etc/php-fpm.d/www.conf

关键配置

[www]
user = www
group = www
listen = /var/run/php74-fpm.sock
listen.owner = www
listen.group = www
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35

解释

  • usergroup:PHP-FPM运行的用户和组。
  • listen:PHP-FPM监听的Unix套接字文件。
  • listen.ownerlisten.group:套接字文件的所有者和所属组。
  • pm:进程管理方式,dynamic表示动态管理。
  • pm.max_children:最大子进程数。
  • pm.start_servers:启动时的子进程数。
  • pm.min_spare_serverspm.max_spare_servers:最小和最大空闲子进程数。

4. 创建必要的目录

sudo mkdir -p /usr/local/php74/var/run
sudo mkdir -p /usr/local/php74/var/log

解释

  • mkdir -p:创建目录,如果上级目录不存在则一并创建。
  • /usr/local/php74/var/run:存放PHP-FPM进程ID文件。
  • /usr/local/php74/var/log:存放PHP-FPM日志文件。

5. 启动PHP-FPM

sudo /usr/local/php74/sbin/php-fpm

解释

  • sudo /usr/local/php74/sbin/php-fpm:以超级用户权限启动PHP-FPM服务。

说明

  • 可以使用ps aux | grep php-fpm命令确认PHP-FPM是否正在运行。

配置Web服务器使用PHP-FPM 🌐

Nginx为例,配置Web服务器与PHP-FPM通信。

1. 安装Nginx

sudo yum install nginx -y

解释

  • yum install nginx -y:安装Nginx并自动确认。

2. 启动并启用Nginx服务

sudo systemctl start nginx
sudo systemctl enable nginx

解释

  • systemctl start nginx:启动Nginx服务。
  • systemctl enable nginx:设置Nginx服务开机自启。

3. 配置Nginx虚拟主机

编辑Nginx的配置文件,指定PHP-FPM的Unix套接字。

sudo nano /etc/nginx/conf.d/php74.conf

示例配置

server {
    listen       80;
    server_name  your_domain.com;
    root         /var/www/html;

    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php74-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~ /\.ht {
        deny all;
    }
}

解释

  • listen 80:监听80端口。
  • server_name your_domain.com:替换为您的域名。
  • root /var/www/html:网站根目录。
  • location /:处理静态文件请求。
  • location ~ \.php$:处理PHP文件请求。

    • include fastcgi_params:包含FastCGI参数。
    • fastcgi_pass unix:/var/run/php74-fpm.sock:指定PHP-FPM监听的Unix套接字。
    • fastcgi_param SCRIPT_FILENAME:传递脚本文件路径给PHP-FPM。
  • location ~ /\.ht:禁止访问.ht文件。

4. 测试Nginx配置并重启服务

sudo nginx -t
sudo systemctl restart nginx

解释

  • nginx -t:测试Nginx配置文件是否有语法错误。
  • systemctl restart nginx:重启Nginx服务以应用新配置。

实现PHP多版本切换 🔄

安装多个PHP版本后,您需要能够在不同版本之间进行切换,以满足不同项目的需求。以下是实现PHP多版本切换的详细步骤。

1. 安装第二个PHP版本

假设您需要安装PHP 8.0,重复之前的下载、解压、配置、编译和安装步骤,但更改安装目录和配置选项。

wget https://www.php.net/distributions/php-8.0.0.tar.gz
tar -zxvf php-8.0.0.tar.gz
cd php-8.0.0

./configure --prefix=/usr/local/php80 \
--with-config-file-path=/usr/local/php80/etc \
--with-mysqli \
--with-pdo-mysql \
--with-openssl \
--with-curl \
--with-zlib \
--with-libxml-dir=/usr \
--enable-mbstring \
--enable-sockets \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--enable-opcache \
--enable-bcmath \
--enable-soap \
--enable-zip \
--enable-fpm \
--with-fpm-user=www \
--with-fpm-group=www

make
sudo make install

解释

  • --prefix=/usr/local/php80:安装目录为/usr/local/php80,与PHP 7.4分开管理。

2. 配置PHP-FPM

复制并编辑PHP-FPM配置文件:

cp /usr/local/php80/etc/php-fpm.conf.default /usr/local/php80/etc/php-fpm.conf
cp /usr/local/php80/etc/php-fpm.d/www.conf.default /usr/local/php80/etc/php-fpm.d/www.conf

编辑php-fpm.conf

nano /usr/local/php80/etc/php-fpm.conf

修改关键配置:

[global]
pid = /usr/local/php80/var/run/php-fpm.pid
error_log = /usr/local/php80/var/log/php-fpm.log
include=/usr/local/php80/etc/php-fpm.d/*.conf

编辑www.conf

nano /usr/local/php80/etc/php-fpm.d/www.conf

修改关键配置:

[www]
user = www
group = www
listen = /var/run/php80-fpm.sock
listen.owner = www
listen.group = www
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35

3. 启动PHP 8.0-FPM

sudo mkdir -p /usr/local/php80/var/run
sudo mkdir -p /usr/local/php80/var/log
sudo /usr/local/php80/sbin/php-fpm

解释

  • 创建运行目录和日志目录。
  • 启动PHP-FPM服务。

4. 配置Nginx虚拟主机

为PHP 8.0创建新的Nginx配置文件:

sudo nano /etc/nginx/conf.d/php80.conf

示例配置

server {
    listen       8080;
    server_name  php80.your_domain.com;
    root         /var/www/php80;

    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php80-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~ /\.ht {
        deny all;
    }
}

解释

  • listen 8080:监听8080端口,避免与PHP 7.4配置冲突。
  • server_name php80.your_domain.com:替换为您的域名或子域名。
  • root /var/www/php80:网站根目录。
  • fastcgi_pass unix:/var/run/php80-fpm.sock:指定PHP 8.0的Unix套接字。

5. 创建网站根目录并测试

sudo mkdir -p /var/www/php80
echo "<?php phpinfo(); ?>" | sudo tee /var/www/php80/index.php

解释

  • 创建网站根目录。
  • 创建index.php文件,内容为phpinfo()函数,用于测试PHP配置。

6. 测试Nginx配置并重启服务

sudo nginx -t
sudo systemctl restart nginx

解释

  • 测试Nginx配置文件。
  • 重启Nginx服务以应用新配置。

7. 访问测试页面

在浏览器中访问http://php80.your_domain.com:8080,应显示PHP 8.0的配置信息页面。


实现PHP多版本切换 🕹️

通过配置不同的Nginx虚拟主机,您可以为不同的项目指定不同的PHP版本。以下是具体的实现方法。

1. 配置多个Nginx虚拟主机

假设您有两个项目,分别需要PHP 7.4和PHP 8.0。您可以为每个项目创建独立的Nginx配置文件。

项目1:PHP 7.4

server {
    listen       80;
    server_name  project1.your_domain.com;
    root         /var/www/project1;

    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php74-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~ /\.ht {
        deny all;
    }
}

项目2:PHP 8.0

server {
    listen       8080;
    server_name  project2.your_domain.com;
    root         /var/www/project2;

    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php80-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~ /\.ht {
        deny all;
    }
}

解释

  • 每个虚拟主机指定不同的server_nameroot目录。
  • fastcgi_pass指向不同版本的PHP-FPM套接字,实现版本隔离。

2. 创建项目根目录并测试

项目1:PHP 7.4

sudo mkdir -p /var/www/project1
echo "<?php phpinfo(); ?>" | sudo tee /var/www/project1/index.php

项目2:PHP 8.0

sudo mkdir -p /var/www/project2
echo "<?php phpinfo(); ?>" | sudo tee /var/www/project2/index.php

3. 测试并验证

  • 访问http://project1.your_domain.com,应显示PHP 7.4的配置信息。
  • 访问http://project2.your_domain.com:8080,应显示PHP 8.0的配置信息。

4. 使用环境变量切换PHP版本(高级方法)

如果需要在同一端口下动态切换PHP版本,可以使用环境变量或代理工具,如PHP Switcher,但这需要更复杂的配置和脚本支持。


常见问题与解决方案 ❓

问题1:PHP-FPM无法启动,提示端口被占用

解决方案

  • 检查指定的Unix套接字文件是否被其他进程占用。
  • 确认listen配置是否唯一,不同版本的PHP-FPM使用不同的套接字文件。

问题2:Nginx无法连接到PHP-FPM

解决方案

  • 确认PHP-FPM服务正在运行。
  • 检查Nginx配置中的fastcgi_pass路径是否正确。
  • 查看PHP-FPM日志文件,定位错误原因。

问题3:PHP版本切换后,网站报错

解决方案

  • 确认Nginx配置文件指向正确的PHP-FPM套接字。
  • 重启Nginx和PHP-FPM服务,确保配置生效。
  • 检查PHP扩展是否安装完整,必要时重新编译安装。

问题4:编译过程中报错,缺少某些库

解决方案

  • 根据报错信息,安装缺失的库和开发文件。
  • 使用yum search命令查找相关库名称,例如:

    sudo yum search libxyz-devel

工作流程图 🛠️

graph TD
    A[开始] --> B[安装开发工具和库]
    B --> C[下载PHP源码]
    C --> D[解压源码]
    D --> E[配置编译选项]
    E --> F[编译PHP]
    F --> G[安装PHP]
    G --> H[配置PHP-FPM]
    H --> I[启动PHP-FPM]
    I --> J[配置Nginx虚拟主机]
    J --> K[创建网站根目录]
    K --> L[访问测试页面]
    L --> M[实现多版本切换]
    M --> N[完成]

说明:此流程图概述了从安装开发工具到实现PHP多版本切换的全过程。


重要命令汇总 📝

命令描述示例
sudo yum update -y更新系统包索引sudo yum update -y
sudo yum groupinstall 'Development Tools' -y安装开发工具组sudo yum groupinstall 'Development Tools' -y
sudo yum install -y libxml2-devel openssl-devel ...安装必要的库和依赖sudo yum install -y libxml2-devel openssl-devel curl-devel ...
wget https://www.php.net/distributions/php-7.4.0.tar.gz下载PHP 7.4源码wget https://www.php.net/distributions/php-7.4.0.tar.gz
tar -zxvf php-7.4.0.tar.gz解压PHP源码tar -zxvf php-7.4.0.tar.gz
./configure --prefix=...配置PHP编译选项./configure --prefix=/usr/local/php74 ...
make编译PHPmake
sudo make install安装PHPsudo make install
sudo /usr/local/php74/sbin/php-fpm启动PHP-FPMsudo /usr/local/php74/sbin/php-fpm
sudo yum install nginx -y安装Nginxsudo yum install nginx -y
sudo systemctl start nginx启动Nginx服务sudo systemctl start nginx
sudo systemctl enable nginx设置Nginx开机自启sudo systemctl enable nginx
sudo nginx -t测试Nginx配置sudo nginx -t
sudo systemctl restart nginx重启Nginx服务sudo systemctl restart nginx
sudo mkdir -p /var/www/project1创建网站根目录sudo mkdir -p /var/www/project1
`echo "<?php phpinfo(); ?>"sudo tee /var/www/project1/index.php`创建测试PHP文件`echo "<?php phpinfo(); ?>"sudo tee /var/www/project1/index.php`

注意事项 ⚠️

  • 权限管理:确保PHP-FPM运行用户(如www)对网站根目录和相关文件具有适当的读写权限。
  • 安全性:建议使用HTTPS保护数据传输安全,可使用Let's Encrypt等工具获取免费SSL证书。
  • 环境变量:在多版本PHP环境中,避免将不同版本的PHP可执行文件路径加入全局PATH,以防冲突。
  • 日志监控:定期检查PHP-FPM和Nginx的日志文件,及时发现和解决潜在问题。
  • 资源优化:根据服务器性能和项目需求,合理配置PHP-FPM的进程管理参数,优化资源使用。
  • 备份配置:定期备份docker-compose.yml、Nginx配置文件和PHP配置文件,防止误操作导致配置丢失。

总结 ✨

CentOS系统上编译安装PHP并实现多版本切换,不仅能够满足不同项目的特定需求,还能提升服务器资源的利用效率。通过以下关键步骤,您可以轻松完成安装并管理多个PHP版本:

  1. 安装必要的开发工具和库:为编译PHP源码提供所需环境。
  2. 下载和解压PHP源码:获取所需的PHP版本源码。
  3. 配置PHP编译选项:启用所需的功能和模块,指定安装目录。
  4. 编译和安装PHP:生成并安装PHP可执行文件和相关组件。
  5. 配置PHP-FPM:为不同版本的PHP配置独立的FPM服务。
  6. 配置Web服务器使用PHP-FPM:通过Nginx虚拟主机关联不同的PHP版本。
  7. 实现PHP多版本切换:通过配置不同的虚拟主机,实现项目间的PHP版本隔离。

通过合理的配置和定期的维护,您可以在CentOS系统上稳定运行多个PHP版本,支持团队的多样化开发需求。希望本指南能够帮助您顺利完成PHP多版本的编译安装与管理,提升开发和运维效率!


蓝易云
25 声望3 粉丝