workerman在windows下启动失败的根本原因是系统不支持fork(),只能运行单进程调试模式(php start.php start -d),需禁用守护进程、多进程逻辑及不兼容扩展,并调整php配置、路径长度与编码。

Workerman在Windows下启动失败,提示“fork() not supported”或直接退出
Workerman 默认依赖 pcntl_fork() 创建子进程,而 Windows 原生不支持 fork() —— 这不是配置问题,是底层限制。phpEnv(基于 PHP-CGI + Nginx/Apache 的轻量环境)默认也走 CGI 模式,更无法模拟 fork 行为。
你看到的报错可能表现为:
- CLI 下执行
php start.php start -d后无响应、秒退 - 日志里出现
Warning: pcntl_fork(): fork() not supported on this platform - 或干脆报
Class 'Workerman\Worker' not found(因自动加载失败,根源仍是启动流程中断)
Workerman 官方明确说明:Windows 仅支持 单进程调试模式(-d 不带 --daemon),且必须禁用多进程相关逻辑。
实操建议:
- 确认 Workerman 版本 ≥ 4.0,旧版对 Windows 兼容更差;新版已内置
Windows检测逻辑 - 启动命令强制用
php start.php start -d,绝对不要加--daemon或-p(后者会触发pcntl_fork) - 在
start.php开头插入检测:if (stripos(PHP_OS, 'WIN') === 0) { echo "Windows detected: forcing single process mode\n"; \Workerman\Worker::$pidFile = ''; \Workerman\Worker::$stdoutFile = './logs/stdout.log'; \Workerman\Worker::$logFile = './logs/workerman.log'; } - 关闭所有依赖多进程的功能:如
Worker::setEventLoopClass()若用了 libevent/libev 扩展,在 Windows 下大概率失效,删掉
phpEnv 中 PHP-CGI 进程反复崩溃、CPU 占满
phpEnv 本质是 Windows 下的 PHP-CGI 管理器,但默认未设进程回收策略。当 Workerman 尝试“守护化”时,会不断拉起新 php-cgi.exe 实例,又因不兼容快速退出,导致残留进程堆积、句柄泄漏、最终 CPU 100%。
这不是 Workerman 写得有问题,而是 phpEnv 把它当普通 CGI 脚本反复调用,而 Workerman 本意是长驻内存运行。
关键解决点:
- 禁止 Web 服务器(Nginx/Apache)反向代理到 Workerman 的端口——
start.php是独立服务,不该走 CGI 流程 - 把
start.php放到 phpEnv 的 web 根目录外,比如C:\workerman-app\,避免被误配进 CGI 处理链 - 检查 phpEnv 配置中是否启用了
php-cgi.exe的“最大请求数”或“空闲超时”,设为0(不限制)或调高(如500),防止频繁重启 - 若仍崩溃,可临时用 Windows 自带的
schtasks替代守护:每 2 分钟检查php-cgi.exe是否存活,挂了就重拉(仅限开发环境)
PHP 内存/执行时间限制导致 Workerman 初始化失败
Workerman 启动时需加载框架、注册事件、初始化连接池,容易触发 memory_limit 或 max_execution_time 限制,尤其在 Windows 下默认值偏低(如 memory_limit = 128M、max_execution_time = 30)。
注意:CLI 模式和 Web 模式读取的是同一份 php.ini,但 phpEnv 可能额外指定一个 CLI 专用 ini(如 php-cli.ini),务必确认改的是对的那个文件。
验证与调整步骤:
- 在命令行运行
php --ini,看 Loaded Configuration File 指向哪;再运行php -r "echo ini_get('memory_limit').PHP_EOL;"确认当前值 - 在对应
php.ini中修改:memory_limit = 512M、max_execution_time = 0(0 表示不限制)、default_socket_timeout = 300 - 如果用
set_time_limit(0)在代码里设,必须放在start.php最顶部,且不能晚于Worker::runAll() - Windows 下某些扩展(如 opcache)在大内存场景有已知 bug,若调高后仍崩溃,可尝试临时注释掉
opcache.enable=1
路径过长或编码问题引发 Workerman 加载失败
Windows 默认路径长度限制 260 字符,而 Workerman + Composer 项目常嵌套多层(如 vendor/workerman/workerman/Events/Select.php),加上中文路径或 phpEnv 安装路径本身较长,极易触发 file not found 或 failed to open stream 错误。
同时,Windows 控制台默认 OEM 编码(如 GBK),若项目含 UTF-8 路径名或注释,require 时可能解析失败。
立即生效的修复方式:
- 启用系统级长路径:以管理员身份运行 PowerShell,执行
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem' -Name 'LongPathsEnabled' -Value 1,然后重启电脑 - 把整个 Workerman 项目移到短路径下,例如
C:\wm\,确保从start.php到任意.php文件的绝对路径 ≤ 180 字符 - 在
start.php开头加sapi_windows_cp_set(65001)(UTF-8 代码页),强制统一 I/O 编码 - 避免在
require路径中使用中文或特殊符号;Composer autoload 的psr-4映射也尽量用纯 ASCII 命名空间
真正卡住人的地方,往往不是 Workerman 本身,而是 Windows 下 PHP 运行时环境与 Unix 设计哲学的根本冲突:没有 fork、路径有上限、代码页不统一、CGI 和 CLI 模式边界模糊。每个“小配置”背后都对应一个系统级约束,漏掉任何一个,都可能让进程静默退出——它不报错,只是不工作。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











