phpEnv在Windows下需同步调优Apache的MaxRequestWorkers、系统句柄限制及PHP-FPM配置:修改httpd.conf中mpm_winnt模块参数,设MaxRequestWorkers为320;注册表调高MaxUserPort至65534、TCPTimedWaitDelay至30;若启用PHP-FPM,须确保pm.max_children≥MaxRequestWorkers,否则请求排队。

phpEnv 是 Windows 下集成 Apache + PHP 的轻量级环境套件,它默认配置偏保守,MaxRequestWorkers 通常只有 150 左右,实际并发一过百就容易出现 503 或响应延迟。调高进程数不是改一个参数就能生效的,必须同步处理 Apache 配置、Windows 系统限制和 PHP-FPM(如果启用)三者的匹配关系。
Apache 配置里改 MaxRequestWorkers 和相关参数
phpEnv 的 Apache 配置文件在 D:\phpEnv\Apache24\conf\httpd.conf(路径以你实际安装为准)。直接搜 mpm_winnt_module,找到它下面的 ThreadsPerChild 和 MaxRequestWorkers 块——注意:Windows 版 Apache 默认用的是 mpm_winnt 模块,不是 prefork 或 event,所以不支持 StartServers 这类参数。
-
ThreadsPerChild:每个子进程创建的线程数,Windows 下固定为 64(不可改),所以MaxRequestWorkers实际 = 子进程数 × 64 -
MaxRequestWorkers:直接设为你想要的并发连接上限,比如320(即 5 个子进程 × 64) -
MaxConnectionsPerChild:建议设为0(永不过期),避免频繁重启子进程带来的抖动
改完后务必检查语法:httpd -t,再重启服务(命令行进 bin 目录执行 httpd -k restart)。
Windows 系统级限制必须调高
Apache 进程数上不去,90% 是卡在 Windows 默认的句柄/端口限制上。即使 MaxRequestWorkers 设成 500,系统只允许每个进程开 500 句柄,照样报 Too many open files 或静默丢请求。
立即学习“PHP免费学习笔记(深入)”;
- 打开注册表编辑器,定位到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters - 新建
DWORD (32-bit)值:MaxUserPort,设为65534(扩大临时端口范围) - 新建
DWORD (32-bit)值:TCPTimedWaitDelay,设为30(缩短 TIME_WAIT 状态持续时间) - 重启系统使注册表生效
这步不能跳过——很多用户改完 Apache 配置没效果,就是栽在这里。
确认是否用了 PHP-FPM,避免双层进程管理冲突
phpEnv 默认是 mod_php 模式(PHP 作为 Apache 模块加载),但部分定制版会启用 PHP-FPM。如果启用了 FPM,MaxRequestWorkers 就得和 pm.max_children 对齐,否则 Apache 线程空转等不到 PHP 响应。
- 查 phpEnv 是否跑 FPM:任务管理器看有没有
php-fpm.exe进程;或看D:\phpEnv\php\php-fpm.conf是否存在 - 如果启用 FPM,
pm.max_children至少要 ≥MaxRequestWorkers,否则请求排队等 PHP worker - 若没启用 FPM,就别碰
php-fpm.conf,也别装php-fpm服务,避免干扰
绝大多数 phpEnv 用户其实没启用 FPM,所以重点还是 Apache 自身的线程和系统限制。
验证并发是否真上去了
光改配置不验证等于白干。用 ab(Apache Bench)或 wrk 测试时注意两点:
- 测试命令里加
-c(并发数)要 ≤ 你设的MaxRequestWorkers,比如ab -n 1000 -c 300 http://localhost/test.php - 观察 Windows 资源监视器里的“句柄数”和“线程数”,Apache 进程句柄数应接近你设的值,且无大量
TIME_WAIT连接堆积
真正卡点永远不在配置文件某一行,而在 Windows 句柄池、Apache mpm_winnt 的线程模型、以及你是否误启了 FPM 却没对齐参数——这三个地方漏一个,调参就白忙活。



















