Windows下Workerman实为单进程,不支持fork和信号处理,无法平滑重启;连接数上限约250,路径、权限、文件操作等存在跨平台差异,Docker部署需注意容器模式与系统调用兼容性。

Windows下Workerman根本不是“多进程”,别被count参数骗了
Windows版Workerman压根不支持fork,所以count属性完全无效——无论你设成4还是16,实际永远只跑一个进程。这不是配置问题,是底层限制。
- 启动时用
php start.php,它就起一个PHP进程;想模拟多进程?得手动拆成start_gateway.php、start_worker.php等多个文件,再一起运行 - 每个
.php文件里只能实例化一个Worker容器(比如WebServer或Gateway),多建一个就会报错Cannot redeclare class - 连接数天花板约200+,不是因为代码写得差,而是Windows的socket和I/O模型扛不住高并发,实测超250后延迟陡增、掉连接频繁
Linux和Windows的信号处理差异,直接决定能不能平滑重启
Linux靠SIGUSR1/SIGUSR2实现reload和优雅退出,而Windows连基本的pcntl_signal都不完整支持——所以所有php start.php reload类命令在Windows下全是摆设。
- Windows只能靠
Ctrl+C硬终止,一关cmd窗口服务全死,没有守护进程能力 - 想模拟“热更新”?得自己加文件监听+重载逻辑,比如用
inotify(Linux)或ReadDirectoryChangesW(Windows)轮询,但后者开销大、易漏事件 - BusinessWorker里如果用了
pcntl_fork或posix_kill,Windows会直接报Call to undefined function
Docker跨平台部署Workerman时,镜像不能混用
Linux容器镜像无法在Windows Docker Desktop的Windows容器模式下运行Workerman,反过来也一样——这不是Workerman的问题,是Docker运行时隔离机制的根本差异。
- Linux镜像依赖
epoll和fork,Windows容器靠IOCP和job objects,系统调用层不兼容 - 哪怕你在Windows上用WSL2跑Linux容器,也要确保PHP扩展一致:比如
event扩展在Linux下可用,在Windows原生环境必须换libev或干脆不用 -
COPY ./app /var/www/html这种路径写法安全,但WORKDIR C:pp在Linux镜像里会失败,跨平台Dockerfile必须统一用正斜杠
从Windows开发到Linux上线,最常崩的是文件路径和权限
Workerman本身不处理路径,但你的业务代码很可能在require、file_get_contents或日志路径里硬编码了或C:,上线Linux就failed to open stream。
- 所有路径拼接改用
dirname(__FILE__) . DIRECTORY_SEPARATOR . 'config.php',别手写 - Linux下Worker进程默认以
www-data或nobody身份运行,对storage/目录没写权限,得提前chown -R www-data:www-data storage/ - Windows下
filemtime()可能返回0,Linux下正常,这种细微差异会在定时器或缓存逻辑里埋雷
Workerman跨平台最难的从来不是语法,而是你忘了自己写的那行file_put_contents('log\error.txt', $msg)——它在Linux上连目录都建不出来。










