windows下无法使用php-fpm,因php官方从未提供windows版且源码禁用编译;必须改用php-cgi.exe(nts版)配合runhiddenconsole以fastcgi模式运行,并正确配置cgi.force_redirect=0、cgi.fix_pathinfo=1及nginx中script_filename为$document_root$fastcgi_script_name。

Windows 下无法直接用 PHP-FPM,必须改用 php-cgi.exe + RunHiddenConsole 启动 CGI 模式;否则 Nginx 会持续返回 502 Bad Gateway。
为什么 Windows 上不能用 php-fpm
PHP 官方从不提供 Windows 版 php-fpm 可执行文件,其源码中也明确禁用了 Windows 编译支持。你在网上看到的所谓“Windows php-fpm”基本是第三方魔改或误传。真实可行路径只有一条:php-cgi.exe 以 FastCGI 模式监听端口(如 127.0.0.1:9000),由 Nginx 通过 fastcgi_pass 转发请求。
- NTS(Non-Thread Safe)版 PHP 是唯一推荐选择,TS 版在 CGI 模式下易崩溃
-
cgi.force_redirect = 0必须设置,否则所有 PHP 请求都会被拒绝(403 或 502) -
cgi.fix_pathinfo = 1要开启,否则PATH_INFO为空,ThinkPHP/Laravel 等框架路由失效 - 别碰
php.ini-production—— 它默认关闭所有扩展,用php.ini-development复制重命名更稳妥
php-cgi 启动脚本必须用 RunHiddenConsole
直接双击运行 php-cgi.exe -b 127.0.0.1:9000 会导致窗口闪退、进程终止。Windows 没有守护进程概念,RunHiddenConsole 是最轻量可靠的后台方案。
- 下载
RunHiddenConsole.exe后,放到和php-cgi.exe同级目录(如D:\server\php\)或任意路径,但脚本里要写对绝对路径 - 批处理内容必须是:
RunHiddenConsole D:\server\php\php-cgi.exe -b 127.0.0.1:9000 -c D:\server\php\php.ini - 不要加
start /B或wscript等花哨写法——它们在 Win11 22H2+ 上兼容性差,容易漏日志、杀不干净进程 - 若需多个 worker,复制多行命令,每行改一个端口(如
:9001、:9002),Nginx 中用 upstream 做负载
nginx.conf 里 SCRIPT_FILENAME 必须用 $document_root
常见错误是沿用 Apache 风格写死路径,比如 fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name,这会导致 404 或 “No input file specified”。Windows 下路径分隔符和大小写不敏感,但 Nginx 内部解析仍依赖变量展开。
- 正确写法只有这一种:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; -
$document_root的值来自上一级location或server块中的root指令,必须是正斜杠(/)分隔的绝对路径,例如root D:/www;,不能写成D:\www - 确保
location ~ \.php$块里没有重复定义root(除非你真要覆盖全局 root) - 别忘了
include fastcgi_params;—— 它提供了基础 FastCGI 参数,缺了会导致 $_SERVER 变量缺失
验证与排错关键点
502 错误不是单一原因,得按顺序排查:先看 PHP 进程是否活着,再看 Nginx 是否连得上,最后看脚本路径是否真存在。
- 用
netstat -ano | findstr :9000查端口是否被监听;没输出说明php-cgi没起来,检查批处理路径和php.ini语法(尤其extension_dir路径末尾不能有多余空格) - 用
curl -v http://127.0.0.1:9000/test.php直连 php-cgi?不行 —— CGI 不响应 HTTP 请求,只能靠 Nginx 转发,所以必须走 Nginx 访问 - 在网站根目录放
info.php,内容为<?php phpinfo(); ?>,访问http://localhost/info.php;若报 500,大概率是php.ini扩展加载失败(比如php_mysqli.dll依赖php_mbstring.dll,后者没启用) - Nginx 错误日志(
logs/error.log)里出现connect() failed (10061)→ php-cgi 没运行;出现Primary script unknown→SCRIPT_FILENAME路径拼错了
最易被忽略的是 php.ini 中 extension_dir 的路径写法:它必须是正斜杠或双反斜杠,且不能包含中文、空格、括号;哪怕路径是对的,末尾多了个空格也会导致所有扩展静默失败,而 php -v 仍显示正常。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











