必须使用nts版php并正确配置fastcgi映射与php.ini关键项,否则php-cgi.exe无法启动或脚本执行异常;常见原因包括ts版不兼容、vc++运行时缺失、路径含空格、path未配置、phprc未指定php.ini路径、php_fcgi_max_requests未设置、模块选错(须用fastcgimodule)、cgi.fix_pathinfo=0未关闭等。

php-cgi.exe 必须被 IIS 正确识别并调用,否则脚本只会下载、显示源码或报 500 错误。核心不是“能不能”,而是“是否用对了 NTS 版 + FastCGI 映射 + php.ini 关键项”。
为什么 php-cgi.exe 找不到或启动失败
最常见的原因是 PHP 版本与 IIS 运行模式不匹配,或系统缺少运行时依赖:
- 必须使用
Non-Thread-Safe(NTS)版本,Thread-Safe(TS)版本在 FastCGI 下会直接崩溃 - VC++ 运行时未安装:PHP 8.2+ 依赖
vc_redist.x64.exe(VS17 或 VS19),缺它会报“0xc000007b”或“FastCGI 进程意外退出” -
php-cgi.exe路径含空格或中文(如C:\Program Files\PHP\),IIS 无法解析,应改用C:\php\这类纯英文无空格路径 - 环境变量
PATH未包含 PHP 目录,导致 IIS 启动php-cgi.exe时找不到依赖 DLL(如php8.dll)
FastCGI 设置里 PHPRC 和 PHP_FCGI_MAX_REQUESTS 是干什么的
这两项不配,php.ini 很可能被忽略,或进程频繁重启:
-
PHPRC指定php.ini的绝对路径(如C:\php\php.ini),否则php-cgi.exe会在当前目录或 Windows 目录下找,容易错位 -
PHP_FCGI_MAX_REQUESTS控制单个 FastCGI 进程处理多少请求后自动回收,默认是 500;设为10000可减少重启抖动,避免 session 丢失或临时文件堆积 - 必须在 IIS 管理器 → “FastCGI 设置” → 对应
php-cgi.exe条目 → “环境变量” 中显式添加,不能只写在php.ini里
处理器映射里模块选 FastCgiModule 还是 CgiModule
选错会导致 404.3(MIME 类型禁止)或 500.0(模块初始化失败):
- IIS 7.5+ 必须用
FastCgiModule—— 它是微软专为 FastCGI 协议优化的模块,支持连接池、超时控制和 stderr 捕获 -
CgiModule是旧式 CGI 实现,每次请求都 fork 新进程,性能差且不支持PHP_FCGI_MAX_REQUESTS,仅用于调试或极老环境 - 映射中“可执行文件”路径必须指向
php-cgi.exe,不是php.exe;后者是 CLI 工具,不响应 FastCGI 协议 - 务必勾选“允许访问此资源的请求”,否则即使映射存在,也会因权限拒绝返回 401/403
php.ini 里哪些配置项实际影响 IIS 运行
不是所有 ini 项都生效,IIS 下真正起作用的是以下几项(其他可能被忽略):
-
cgi.fix_pathinfo=0:必须关闭,否则 IIS 传递的PATH_INFO会被 PHP 二次解析,引发路径遍历风险或 404 -
fastcgi.impersonate=1:让 PHP 以当前网站用户身份(如IUSR)运行,否则文件操作权限错误(如写日志、上传失败) -
extension_dir="C:\php\ext":必须用绝对路径,相对路径在 FastCGI 下无效 -
date.timezone="Asia/Shanghai":不设会导致getdate()等函数警告,部分框架(如 Laravel)启动失败 -
upload_tmp_dir和session.save_path:路径需赋予IIS_IUSRS写权限,否则上传/登录直接失败
php-cgi.exe 能否读 php.ini,IUSR 能否写 session.save_path,FastCgiModule 是否真加载了对应 DLL,这些细节不验证,光看 phpinfo() 成功也没用。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











