生产环境必须用linux运行workerman,windows仅限本地调试;因缺乏fork()、信号机制、posix函数等底层支持,windows下多进程、平滑重启、权限控制等功能全部失效。

生产环境必须用 Linux 运行 Workerman,Windows 只能用于本地调试——这不是权衡取舍,而是底层能力决定的硬性边界。
Windows 下 count 参数完全失效,根本不是“多进程”
你在 Windows 上写 $worker->count = 4,实际只起一个 PHP 进程。Workerman 在 Windows 没有 fork() 支持,只能靠线程模拟,所有连接都挤在单个进程里处理。实测连接数一过 250,延迟飙升、掉线频繁,不是代码问题,是 Windows socket 和 I/O 模型扛不住。
- 每个启动文件(如
start_web.php)只能实例化一个Worker对象,想跑 Gateway + Worker?必须拆成两个文件、手动起两个进程 - 多个
Worker实例共用同一个进程空间,pcntl_fork()、posix_kill()直接报Call to undefined function - 别信 “改了 count 就能压测”,Windows 下压测结果对 Linux 生产环境零参考价值
php start.php reload 类命令在 Windows 下纯属摆设
Linux 靠 SIGUSR1/SIGUSR2 实现平滑重启和优雅退出;Windows 连完整的 pcntl_signal() 都不支持,reload、stop、status 全部无效。你按 Ctrl+C 关掉命令行窗口,整个进程树立刻终止,没有守护能力,也没有信号回调入口。
- 想“热更新”?得自己加文件监听 + 手动
kill+ 重拉进程,容易漏事件、状态错乱 - 业务里用了
register_shutdown_function()或pcntl_async_signals(true)?Windows 下直接跳过,崩溃后无兜底 - 用 Docker Desktop 的 WSL2 模式?没问题,但前提是容器内跑的是 Linux 镜像,不是 Windows 容器
路径、权限、日志全在 Linux 上才可控
Windows 下 C:\workerman\logs 硬编码进代码,上线 Linux 就报 failed to open stream: Permission denied;更麻烦的是权限模型:Linux 能用 useradd -r -s /sbin/nologin -M -U workerman 创建无登录、无家目录、UID 锁定的专用用户,再配 $worker->user = 'workerman' 和 chown -R workerman:workerman logs/,实现最小权限运行。Windows 根本没有等效机制。
-
display_errors = On在 Windows 命令行下可能显示错误,但在 daemon 模式(-d)下 stdout/stderr 被重定向,错误直接丢进黑洞 - SSL 证书路径写成
C:/certs/server.pem?Linux 下file_get_contents()必然失败,且stream_socket_enable_crypto()因权限不足静默失败 - Dockerfile 里写
WORKDIR C:\app?镜像构建直接报错;跨平台必须统一用/var/www/html和正斜杠
真正棘手的不是“能不能跑”,而是“跑起来之后你以为它在干的事,其实根本没发生”——比如你写了心跳逻辑,但 Windows 下连接超时被路由清理,你却在日志里看不到任何断连记录;又比如你配了 log_errors = On,但 error_log 路径在 Windows 下不可写,PHP 错误就彻底消失。这些都不是配置疏忽,是平台能力断层导致的观测盲区。











