phpEnv是Windows集成环境,内置Apache与Nginx双服务并存,通过启停服务和端口配置实现“切换”,非一键互斥切换;切换需同步调整PHP-FPM、cgi.fix_pathinfo及虚拟主机配置。

phpEnv 本身不提供 Apache/Nginx 切换功能 —— 它是 Windows 平台的集成环境,内置的是「Apache + Nginx 双服务共存」模式,切换靠手动启停和端口配置,不是一键切换。
phpEnv 中 Apache 和 Nginx 是并存而非互斥
phpEnv(注意大小写,不是 phpenv)在 Windows 上默认同时安装 Apache 和 Nginx 两个 Web 服务,它们各自监听不同端口(如 Apache:80、Nginx:8080),并不像 Linux 的 LNMP/LAMP 那样需要卸载或替换。你看到的“切换”按钮,本质只是启停服务 + 修改默认访问端口的快捷操作。
常见错误现象:
- 点击“切换到 Nginx”后网站打不开 → 实际是 Nginx 没启动,或浏览器仍访问 80 端口(Apache 占着)
- 切换后 PHP 脚本不解析 → 未检查当前生效的服务是否已关联正确的 PHP 版本(phpEnv 管理的是 PHP-FPM 进程,但 Apache 默认用 mod_php,Nginx 必须走 PHP-FPM)
使用场景:
立即学习“PHP免费学习笔记(深入)”;
- 本地快速验证同一套代码在两种服务器下的重写/PATH_INFO 行为差异
- 调试框架路由(如 Laravel 的
index.php入口)在不同服务器的try_files或RewriteRule下表现
实操建议:
- 先打开 phpEnv 主界面,看右下角状态栏:显示
Apache Running或Nginx Running才算真正生效 - 不要只点“切换”,务必确认目标服务的端口没被占用:打开
phpEnv\config\apache\httpd.conf查Listen 80,打开phpEnv\config\nginx\nginx.conf查listen 8080 - 若想让 Nginx 成为默认访问入口,需手动把它的端口改成 80,并确保 Apache 已停止(否则端口冲突)
切换前必须检查 cgi.fix_pathinfo 配置
这个参数在 Apache 和 Nginx 下行为完全不同,且 phpEnv 的 PHP 配置是全局共享的 —— 一旦设错,Nginx 下 PATH_INFO 为空、$_SERVER['PATH_INFO'] 失效,导致 ThinkPHP、CodeIgniter 等依赖它的框架路由 404。
正确做法:
- Apache 下推荐设为
cgi.fix_pathinfo=1(默认值,兼容 .htaccess) - Nginx 下必须设为
cgi.fix_pathinfo=0,否则会触发安全漏洞(路径遍历),且干扰fastcgi_param PATH_INFO的传递
phpEnv 中修改位置:phpEnv\php\php.ini,改完需重启对应 Web 服务(不是仅重启 PHP)
验证方式:建一个 test.php,内容为 <?php var_dump($_SERVER['PATH_INFO'] ?? 'not set'); ?>,用不同服务器访问 /test.php/abc,观察输出
虚拟主机配置不能复用,必须分别设置
phpEnv 的 Apache 使用 httpd-vhosts.conf,Nginx 使用 nginx.conf 里的 server 块 —— 二者语法、指令名、路径写法全不同,不存在“一套配置通吃”。
典型坑点:
- Apache 的
DocumentRoot "D:/www/myapp"对应 Nginx 的root D:/www/myapp/public;(注意末尾斜杠和 public 目录) - Apache 的
RewriteRule ^(.*)$ index.php [QSA,L]在 Nginx 中要写成try_files $uri $uri/ /index.php?$query_string; - Apache 启用
.htaccess需AllowOverride All;Nginx 根本不读.htaccess,所有规则必须硬编码进server块
phpEnv 的配置文件路径:
- Apache 虚拟主机:
phpEnv\config\apache\extra\httpd-vhosts.conf - Nginx 站点配置:
phpEnv\config\nginx\vhost\your-site.conf
PHP-FPM 是 Nginx 必选项,Apache 下可选但不推荐混用
phpEnv 内置 PHP-FPM,但 Apache 默认走 mod_php(即 PHP 作为模块嵌入 Apache 进程)。强行让 Apache 也用 PHP-FPM(通过 ProxyPassMatch),会引入额外延迟和配置复杂度,且 phpEnv 未对此做适配。
所以实际切换逻辑是:
- 用 Apache → PHP 由
mod_php处理,php.ini生效,无需启动 PHP-FPM 服务 - 用 Nginx → 必须启用 PHP-FPM(phpEnv 界面有独立开关),且
nginx.conf中的fastcgi_pass 127.0.0.1:9000必须与 PHP-FPM 的监听地址一致
容易被忽略的关键点:
- 切换服务器后,忘了开/关 PHP-FPM 服务 → Nginx 报 502 Bad Gateway,Apache 无影响
- PHP-FPM 的
php.ini和 Apache 的php.ini是同一个文件,但某些扩展(如opcache)在 FPM 模式下需额外启用opcache.enable_cli=0 - phpEnv 的“PHP 版本切换”只影响 CLI 和 PHP-FPM,不影响 Apache 的
mod_php—— 若你同时装了多个 PHP,Apache 仍固定用最初安装的那个版本



















