引言
在 Windows 环境下,PHP 的官方构建不包含 php-fpm.exe
,因此无法直接使用 PHP-FPM 来处理高并发 PHP 请求。然而,PHP 提供了 php-cgi.exe
,通过 FastCGI 协议可以实现类似 PHP-FPM 的功能,配合 Nginx 等 Web 服务器运行 PHP 应用。本文将详细介绍如何在 Windows 上使用 php-cgi.exe
配置 PHP 运行环境,支持多个 PHP 版本(例如 PHP 7.4 和 PHP 8.4),并无需创建 php-fpm.conf
文件。以下内容基于 PHP 8.4.10(NTS,Visual C++ 2022 x64)和其他常见版本。
为什么 Windows 上没有 php-fpm.exe
PHP-FPM(FastCGI Process Manager)是为 Unix/Linux 系统设计的进程管理器,依赖 fork() 机制,而 Windows 不支持此机制。因此,官方 Windows PHP 构建不包含 php-fpm.exe
,也无需 php-fpm.conf
配置文件。取而代之的是 php-cgi.exe
,它支持 FastCGI 协议,可以启动 FastCGI 服务,监听指定端口,处理 Nginx 或其他 Web 服务器的 PHP 请求。
在 Windows 上,php-cgi.exe
是非线程安全(Non-Thread Safe, NTS)版本 PHP 的标配,适合与 Nginx 配合使用。通过命令行参数(如 -b
指定端口)或 php.ini
配置,php-cgi.exe
可以实现类似 PHP-FPM 的功能,无需额外的配置文件。
配置单版本 PHP 运行环境
1. 确认 PHP 安装
确保 PHP 已正确安装,包含 php-cgi.exe
。以 PHP 8.4.10 为例,假设安装目录为 C:\php
:
- 检查文件:
- 确认
C:\php
包含php.exe
和php-cgi.exe
:dir C:\php\php-cgi.exe
- 运行版本检查:
输出示例:php -v php-cgi.exe -v
PHP 8.4.10 (cli) (built: Jul 2 2025 11:04:30) (NTS Visual C++ 2022 x64) PHP 8.4.10 (cgi-fcgi) (built: Jul 2 2025 11:04:30) (NTS Visual C++ 2022 x64)
- 确认
- 下载正确版本(若缺少
php-cgi.exe
):- 访问 windows.php.net/download,下载 NTS 版本(如
php-8.4.x-Win32-vs16-x64.zip
)。 - 解压到
C:\php
,确保包含php-cgi.exe
。
- 访问 windows.php.net/download,下载 NTS 版本(如
2. 配置 php.ini
- 在
C:\php
中,复制php.ini-development
为php.ini
:copy C:\php\php.ini-development C:\php\php.ini
- 编辑
php.ini
,设置 FastCGI 和基本参数:cgi.fix_pathinfo=0 cgi.force_redirect=1 fastcgi.impersonate=1 cgi.rfc2616_headers=0 extension_dir="ext" date.timezone=Asia/Shanghai error_log=C:\php\php_errors.log extension=gd extension=mysqli extension=pdo_mysql
- 验证配置:
确认php --ini
Loaded Configuration File
为C:\php\php.ini
。
3. 启动 FastCGI 服务
- 创建批处理脚本(
C:\php\start-php-cgi.bat
):@echo off echo Starting PHP FastCGI on port 9000... cd /d C:\php php-cgi.exe -b 127.0.0.1:9000
- 双击运行
start-php-cgi.bat
,启动php-cgi.exe
并监听127.0.0.1:9000
。 - 验证端口:
输出示例:netstat -an | find "9000"
TCP 127.0.0.1:9000 0.0.0.0:0 LISTENING
4. 配置 Nginx
- 假设 Nginx 安装在
C:\nginx
,编辑C:\nginx\conf\nginx.conf
:http { server { listen 80; server_name localhost; root C:/www; index index.php index.html; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } }
- 测试和重启 Nginx:
C:\nginx\nginx.exe -t C:\nginx\nginx.exe -s reload
5. 测试
- 在
C:\www
创建test.php
:<?php phpinfo(); ?>
- 浏览器访问
http://localhost/test.php
,确认 PHP 版本为 8.4.10。
配置多版本 PHP 运行环境
要在同一台 Windows 服务器上运行多个 PHP 版本(例如 PHP 7.4 和 PHP 8.4),需为每个版本分配不同的 FastCGI 端口。
1. 安装多版本 PHP
- 下载 PHP 7.4(NTS 版本)并解压到
C:\php74
。 - 确认
C:\php74\php-cgi.exe
存在。 - 配置
C:\php74\php.ini
,类似单版本配置。
2. 启动多版本 FastCGI 服务
- 为 PHP 7.4 创建批处理脚本(
C:\php74\start-php74-cgi.bat
):@echo off echo Starting PHP 7.4 FastCGI on port 9000... cd /d C:\php74 php-cgi.exe -b 127.0.0.1:9000
- 为 PHP 8.4 创建批处理脚本(
C:\php84\start-php84-cgi.bat
):@echo off echo Starting PHP 8.4 FastCGI on port 9001... cd /d C:\php84 php-cgi.exe -b 127.0.0.1:9001
- 运行两个脚本:
C:\php74\start-php74-cgi.bat C:\php84\start-php84-cgi.bat
- 验证端口:
netstat -an | find "9000" netstat -an | find "9001"
3. 配置 Nginx 支持多版本
- 编辑
C:\nginx\conf\nginx.conf
: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.4 fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } }
- 编辑
C:\Windows\System32\drivers\etc\hosts
:127.0.0.1 site1.local 127.0.0.1 site2.local
- 测试和重启 Nginx:
C:\nginx\nginx.exe -t C:\nginx\nginx.exe -s reload
4. 测试多版本
- 在
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.4 信息)
自动化运行(可选)
为避免每次手动运行批处理脚本,可使用 NSSM 将 php-cgi.exe
配置为 Windows 服务:
- 下载 NSSM(nssm.cc)。
- 安装服务:
nssm install php-cgi-74 C:\php74\php-cgi.exe nssm set php-cgi-74 AppParameters -b 127.0.0.1:9000 nssm install php-cgi-84 C:\php84\php-cgi.exe nssm set php-cgi-84 AppParameters -b 127.0.0.1:9001
- 启动服务:
nssm start php-cgi-74 nssm start php-cgi-84
注意事项
-
端口冲突:
- 确保每个 PHP 版本使用不同端口(如
9000
、9001
)。 - 使用
netstat -an | find "LISTEN"
检查端口占用。
- 确保每个 PHP 版本使用不同端口(如
-
性能限制:
- Windows 上的
php-cgi.exe
不如 Linux 的 PHP-FPM 高效,适合中小型应用。 - 高并发场景可考虑使用 WSL2 或 Docker 运行 Linux PHP-FPM。
- Windows 上的
-
日志排查:
- 检查
C:\php\php_errors.log
(由php.ini
的error_log
指定)。 - 若启动失败,运行
php-cgi.exe -b 127.0.0.1:9000
查看错误。
- 检查
-
安全性:
- 避免以管理员权限运行
php-cgi.exe
。 - 使用防火墙限制端口访问(如
9000
、9001
)。
- 避免以管理员权限运行
总结
Windows 上的 PHP 不包含 php-fpm.exe
和 php-fpm.conf
,但通过 php-cgi.exe
可以实现 FastCGI 服务,无需额外配置文件。php-cgi.exe
通过命令行参数(如 -b 127.0.0.1:9000
)指定端口,配合 Nginx 可轻松运行 PHP 应用。多版本 PHP 环境通过不同端口(如 9000
、9001
)区分,批处理脚本或 NSSM 可简化管理。