workerman协程与swoole协程不可混用,因底层事件循环冲突,同一worker中同时配置会启动报错;不同worker间可分别配置驱动实现安全共存,需确保协程操作限定于同驱动内。

Workerman协程和Swoole协程混用会导致运行时崩溃,因为二者底层事件循环模型根本冲突,不能在同一Worker进程中并存。
同一个Worker里混用必然失败
在单个Worker实例中同时指定 Swoole 和 Fiber(或 Swow)驱动,Workerman 启动时会直接报错退出,不会进入服务监听状态。
例如在 config/process.php 中给同一进程同时设置 【eventLoop => Workerman\Events\Swoole::class】 和 【eventLoop => Workerman\Events\Fiber::class】,启动时提示 Class 'Workerman\Events\Fiber' not found 或 EventLoop conflict,具体错误取决于加载顺序。
这是因为 Workerman 的 eventLoop 属性只接受一个类名字符串,赋值两次会覆盖,但底层驱动初始化逻辑检测到不兼容类型时主动终止。
不同Worker间可安全共存
Webman 允许为不同端口的 Worker 分别配置协程驱动,这是官方支持的混合部署方式。
方法一:配置两个独立 HTTP 进程
在 config/process.php 中定义两个进程:
第一个进程监听 8787 端口,不开启协程(eventLoop 为空);
第二个进程监听 8686 端口,明确设置 【eventLoop => Workerman\Events\Swoole::class】;
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
这样两个端口的服务分别运行在不同 Worker 进程中,互不影响。
方法二:用 Nginx 做路由分发
把 /api/ 路径转发到 8686(Swoole 协程),把 /ws/ 路径转发到 8787(纯事件循环),后端代码无需感知协程差异。
协程切换必须发生在同驱动内
第一步:确认当前 Worker 使用的 eventLoop 类型
通过 var_dump($worker->eventLoop) 或查看 workerman status 输出中的 event-loop 字段判断实际生效驱动。
第二步:所有协程创建必须依赖当前 Worker 的驱动能力
比如 Swoole 驱动下,file_get_contents()、curl_exec() 等阻塞函数会被自动协程化;Fiber 驱动下这些函数仍会阻塞整个进程,必须改用 async-http-client 等非阻塞替代方案。
第三步:跨 Worker 的协程无法传递上下文
协程变量、Context 数据仅在当前 Worker 进程内有效,不要试图在 Swoole Worker 中 await Fiber Worker 的返回结果——它们之间没有调度关系,也没有共享内存通道。










