引言
在 Web 开发中,开发者可能需要在同一台 Windows 服务器上运行多个 PHP 版本(例如 PHP 7.4 和 PHP 8.2),以支持不同项目的兼容性需求。结合 Nginx 和 PHP-FPM,可以高效处理 PHP 应用的高并发请求。本文将详细介绍如何在 Windows 系统上安装和配置多个 PHP 版本,并通过 Nginx 调用这些版本,无需依赖环境变量。
安装多个 PHP 版本
下载和解压 PHP
- 访问 PHP 官方网站,下载所需版本的 PHP(建议选择非线程安全版本,Non-Thread Safe, NTS,以确保包含 PHP-FPM)。
- 例如:下载 PHP 7.4 和 PHP 8.2 的 ZIP 包。
- 将每个版本解压到独立目录,例如:
- PHP 7.4:
C:\php\php-7.4
- PHP 8.2:
C:\php\php-8.2
- PHP 7.4:
- 确认每个目录包含
php.exe
和php-fpm.exe
(若缺失 PHP-FPM,需重新下载 NTS 版本)。
配置 PHP.ini
- 在每个 PHP 版本目录下,找到
php.ini-development
或php.ini-production
文件。 - 复制并重命名为
php.ini
,并配置关键参数,例如:- PHP 7.4:
extension_dir = "C:\php\php-7.4\ext"
- PHP 8.2:
extension_dir = "C:\php\php-8.2\ext"
- 设置时区:
date.timezone = Asia/Shanghai
- PHP 7.4:
- 根据项目需求启用扩展(如
extension=gd
)。
配置 PHP-FPM
每个 PHP 版本需要独立的 PHP-FPM 配置文件,以避免端口冲突。
-
检查配置文件:
- 打开
C:\php\php-7.4\etc\php-fpm.conf
和C:\php\php-8.2\etc\php-fpm.conf
。 - 如果文件不存在,创建
php-fpm.conf
,添加以下内容:
对于 PHP 8.2,将[global] pid = run/php-fpm.pid error_log = log/php-fpm.log [www] listen = 127.0.0.1:9000 ; PHP 7.4 使用 9000 端口 user = nobody group = nobody pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3
listen
改为:listen = 127.0.0.1:9001 ; PHP 8.2 使用 9001 端口
- 打开
-
验证配置:
- 运行以下命令检查配置文件:
C:\php\php-7.4\php-fpm.exe -t C:\php\php-8.2\php-fpm.exe -t
- 如果返回
[OK]
,配置正确;否则,根据错误信息调整。
- 运行以下命令检查配置文件:
-
启动 PHP-FPM:
- 使用完整路径启动:
C:\php\php-7.4\php-fpm.exe C:\php\php-8.2\php-fpm.exe
- 验证端口是否监听:
应显示netstat -an | find "9000" netstat -an | find "9001"
TCP 127.0.0.1:9000 0.0.0.0:0 LISTENING
和类似 9001 的输出。
- 使用完整路径启动:
配置 Nginx 调用多个 PHP 版本
Nginx 通过 FastCGI 协议与 PHP-FPM 通信,无需将 PHP 路径添加到系统环境变量 Path
。
-
安装 Nginx:
- 下载 Nginx for Windows(从 nginx.org),解压到
C:\nginx
。 - 确保 Nginx 可运行:
C:\nginx\nginx.exe
- 下载 Nginx for Windows(从 nginx.org),解压到
-
编辑 Nginx 配置文件:
- 打开
C:\nginx\conf\nginx.conf
,配置不同站点使用不同 PHP 版本:http { server { listen 80; server_name site1.local; root C:/www/site1; # 网站根目录 index index.php index.html; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; # PHP 7.4 fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } server { listen 80; server_name site2.local; root C:/www/site2; # 网站根目录 index index.php index.html; location ~ \.php$ { fastcgi_pass 127.0.0.1:9001; # PHP 8.2 fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } }
- 打开
-
配置 Hosts 文件:
- 编辑
C:\Windows\System32\drivers\etc\hosts
,添加:127.0.0.1 site1.local 127.0.0.1 site2.local
- 编辑
-
测试和重启 Nginx:
- 测试配置:
C:\nginx\nginx.exe -t
- 重启 Nginx:
C:\nginx\nginx.exe -s reload
- 测试配置:
测试配置
- 创建测试文件:
- 在
C:\www\site1
和C:\www\site2
下分别创建test.php
:<?php phpinfo(); ?>
- 在
- 访问测试页面:
- 在浏览器访问:
http://site1.local/test.php
(应显示 PHP 7.4 信息)http://site2.local/test.php
(应显示 PHP 8.2 信息)
- 在浏览器访问:
- 验证版本:
- 检查输出的 PHP 版本信息,确保与预期匹配。
环境变量的非必要性
在上述配置中,Nginx 不依赖系统 Path
环境变量调用 PHP-FPM,因为:
- PHP-FPM 通过指定路径手动启动(
C:\php\php-x.x\php-fpm.exe
)。 - Nginx 通过
fastcgi_pass
直接连接 PHP-FPM 的监听端口(如127.0.0.1:9000
)。 - 只需要确保 PHP-FPM 进程运行,且 Nginx 配置文件正确指向端口。
若需在命令行中简化操作,可使用 PowerShell 别名或脚本,而无需修改系统环境变量。例如:
Set-Alias php74 C:\php\php-7.4\php.exe
Set-Alias fpm74 C:\php\php-7.4\php-fpm.exe
注意事项
- PHP-FPM 可用性:
- 确保每个 PHP 版本包含
php-fpm.exe
。若缺失,下载 NTS 版本。
- 确保每个 PHP 版本包含
- 端口冲突:
- 不同 PHP 版本的 PHP-FPM 需使用不同端口(如 9000、9001)。
- 日志排查:
- 检查 PHP-FPM 日志(
C:\php\php-x.x\log\php-fpm.log
)和 Nginx 日志(C:\nginx\logs\error.log
)以定位错误。
- 检查 PHP-FPM 日志(
- 自动化启动:
- 使用批处理脚本或工具(如 NSSM)将 PHP-FPM 配置为 Windows 服务,方便自动启动。
- 安全性:
- 避免以
root
或高权限用户运行 PHP-FPM。 - 使用防火墙限制对 PHP-FPM 端口的外部访问。
- 避免以
总结
在 Windows 上,你可以轻松安装和运行多个 PHP 版本,并通过 Nginx 和 PHP-FPM 支持多站点配置。无需将 PHP 路径添加到环境变量,只需正确配置 PHP-FPM 的监听端口和 Nginx 的 FastCGI 设置即可。通过完整路径启动 PHP-FPM,并为不同站点分配不同 PHP 版本,可以灵活满足项目需求。