Windows下Workerman原生仅支持单进程,因缺乏fork()机制;workerman-for-win需特定PHP环境才可能多进程;开发可手动拆分服务实例;正式环境禁用Windows因其连接数低、无守护能力、信号处理残缺。

Windows原生Workerman不支持多进程
官方Workerman在Windows下是单进程模型,count属性完全无效,无论你设成4还是16,实际只起一个Worker进程。这不是配置问题,是底层机制限制——Windows缺乏fork()语义,Workerman主进程无法派生子工作进程。
- 启动时即使写了
Worker::$processCount = 4;,日志里也只会显示Starting worker in single process mode - 每个
php start.php命令只对应一个CMD窗口、一个PHP进程,关掉窗口服务立刻终止 - 并发连接数卡在200+,不是因为代码写得差,而是Win版EventLoop(select)性能瓶颈所致
workerman-for-win能真多进程?要看版本和PHP环境
workerman-for-win是第三方补丁项目,它用Windows API模拟了多进程调度,但效果高度依赖PHP版本和运行方式。PHP 8.1+ + VC17线程安全版 + 管理员权限CMD下启动,才可能看到多个php.exe进程;换成非TS版或PHP 7.4,大概率退化为单进程轮询。
- 必须用
start.bat而非直接php start.php,否则进程管理器不生效 - 进程间通信靠命名管道(
\.pipe...),若杀进程不干净,残留管道会导致下次启动报Unable to create pipe - 它不兼容
pcntl扩展(Windows本就不支持),所以所有pcntl_*函数调用会静默失败
开发阶段怎么绕过限制跑多个服务实例
既然不能靠count拉多个Worker,就手动拆:每个功能模块单独一个启动文件,各自占一个CMD窗口。这是目前Windows下最稳定、最可控的做法。
-
start_web.php只实例化WebServer,监听http://0.0.0.0:8080 -
start_gateway.php只实例化Gateway,监听websocket://0.0.0.0:2346 -
start_business.php只实例化BusinessWorker,连接本地Gateway - 全部用
php start_web.php start_gateway.php start_business.php一行启动,但它们仍是彼此独立的进程,不共享内存
为什么正式环境坚决不能上Windows
不是因为“不够酷”或者“老土”,是三个硬伤叠加:连接数天花板低、无守护能力、信号处理残缺。比如reload命令在Linux下能平滑重启Worker,在Windows下直接报Command not supported on Windows,只能手动Ctrl+C再重敲命令——线上服务哪经得起这样折腾。
- 哪怕你用
workerman-for-win强行跑出4个进程,其负载均衡策略是轮询而非事件驱动,高并发下容易出现某进程饿死、某进程积压 - Windows服务管理器(
sc create)注册的Workerman服务,无法响应SIGUSR1类信号,日志切割、配置热更全得自己写定时任务 - 所有基于
Worker::reload()或Worker::stop()做的运维自动化脚本,在Windows下等同于废代码
真正麻烦的不是“能不能跑起来”,而是“跑起来之后,你不敢动它”。










