必须严格隔离Swoole、Swow、Fiber三类协程驱动,禁止单Worker混用;通过php start.php status查看event-loop列确认驱动类型;各Worker需按粒度绑定唯一驱动并分文件启动;禁用Composer中冲突的event-loop自动加载。

Workerman协程多版本混用项目中,不同Worker进程若混用Swoole、Swow、Fiber三类协程驱动,会导致事件循环冲突、协程调度失效甚至进程崩溃,必须严格隔离驱动类型。
确认当前项目中实际启用的协程驱动
进入项目根目录,执行php start.php status,观察输出中WORKERS表格下的event-loop列值;若显示revolt,说明使用Fiber驱动;若为swoole或swow,则对应扩展已生效;【禁止在单个Worker实例中同时看到多个event-loop类型】。
若输出为空或报错,说明未显式指定驱动,此时Workerman会回退至低精度Select驱动,不支持协程,需立即修正配置。
按Worker粒度强制绑定唯一协程驱动
每个Worker实例只能绑定一种协程驱动,不可复用或动态切换。以下为三种标准写法:
方法一:Swoole驱动(需已安装swoole扩展v5.0+)
在Worker创建后、runAll前设置:
$worker = new Worker('http://0.0.0.0:8080');<br>$worker->eventLoop = \Workerman\Events\Swoole::class;
方法二:Swow驱动(需已安装swow扩展v1.4+)
同理设置:$worker->eventLoop = \Workerman\Events\Swow::class;
方法三:Fiber驱动(无需扩展,但PHP需≥8.1且启用Fiber)
使用Revolt事件循环:$worker->eventLoop = \Workerman\Events\Revolt::class;
注意:此模式下file_get_contents等原生阻塞函数仍会挂起整个进程,必须改用workerman/http-client等协程兼容组件。
隔离不同驱动的Worker启动入口
第一步:将Swoole驱动Worker的启动逻辑单独拆出为start_swoole.php,内容仅含Swoole Worker定义与Worker::runAll();
第二步:将Fiber驱动Worker的启动逻辑放入start_fiber.php,同样只保留对应Worker及runAll;
第三步:在Linux终端中分别启动:php start_swoole.php start -d → php start_fiber.php start -d;
【严禁在同一个PHP进程内混合调用多个runAll()】,否则eventLoop注册冲突将导致后续Worker无法初始化。
第四步:验证两个进程是否独立运行——检查ps aux | grep php,应看到两条独立进程,各自监听不同端口,且无共享内存或全局协程上下文。
禁用Composer自动加载中的协程驱动冲突
若项目中同时引入了workerman-ripple和workerman/mysql,二者底层event-loop依赖可能不一致;打开composer.json,删除所有显式声明event-loop类的autoload映射,仅保留vendor/autoload.php默认加载;
执行composer dump-autoload -o重建自动加载索引,避免命名空间覆盖导致的驱动误加载。
这一步操作起来很简单,直接把文件拖进去就行。











