“Primary script unknown”错误本质是PHP-FPM收到请求但找不到PHP文件路径,主因包括SCRIPT_FILENAME路径不匹配、root配置位置错误、Windows路径分隔符混用、目录嵌套过深或权限不足;phpEnv仅管理环境,不处理FastCGI,需检查Nginx与PHP-FPM配置一致性及手动重载Nginx。

phpEnv 本身不处理 FastCGI 协议,报错一定是 Nginx 或 PHP-FPM 配置层面的问题,不是 phpEnv 的锅。 它只是个环境管理工具,负责切换 PHP 版本和启动服务,但 SCRIPT_FILENAME 路径拼接、socket 连接、权限控制这些关键链路,全由你写的 Nginx 配置和 PHP-FPM 实际监听状态决定。
为什么 phpEnv 启动后仍报 “FastCGI sent in stderr: Primary script unknown”
这个错误本质是 PHP-FPM 收到请求,但找不到要执行的 PHP 文件路径。常见原因有:
-
fastcgi_param SCRIPT_FILENAME拼出来的路径和磁盘上真实路径不一致(比如$document_root是E:/demo/code/dev/webproject,但实际文件在E:/webproject) - Nginx 的
root指令写在location块里,导致$document_root在 PHP location 中失效 - Windows 下路径分隔符混用(
\和/),PHP-FPM 解析时路径截断或识别失败 - 目录嵌套过深(如超过 8 层),Windows API 或 PHP 的
realpath()调用失败,返回空路径
phpEnv 环境下 fastcgi_pass 应该用 socket 还是 TCP?
优先用 unix:/path/to/php-fpm.sock(Unix socket),但在 Windows 下 phpEnv 默认只支持 TCP(127.0.0.1:9000)。注意:
- 确认 phpEnv 启动的 PHP-FPM 确实在监听
127.0.0.1:9000(查php-fpm.conf中的listen行) - 如果改用 socket,需手动在 phpEnv 的 PHP-FPM 配置中启用
listen = /tmp/php-fpm.sock并赋权,Windows 下还得装 WSL 或改用 Docker 才可靠 - TCP 方式更易排查:用
telnet 127.0.0.1 9000能连上,说明端口通;连不上就先查 phpEnv 是否真启动了 PHP-FPM
phpEnv 的 root 路径设置必须避开长路径和中文
Windows + phpEnv 组合对路径特别敏感。以下操作能直接规避多数 “Primary script unknown”:
立即学习“PHP免费学习笔记(深入)”;
- 把项目根目录移到盘符下一级,例如从
E:/demo/code/dev/webproject改为E:/webproject - 确保
root指令写在server块顶层,不要套在location里 - 路径中避免空格、中文、特殊符号;Nginx 配置里的路径统一用正斜杠
/(即使 Windows) - 检查 Nginx worker 进程用户(通常是
SYSTEM或当前登录用户)能否读取该目录——右键目录 → 属性 → 安全 → 看是否有对应用户且勾选“读取”
最常被忽略的一点:phpEnv 启动 PHP-FPM 后,它默认不会自动 reload Nginx。你改完 nginx.conf,必须手动执行 nginx -s reload 或重启 phpEnv 的 Nginx 服务,否则所有配置变更都不生效。



















