Revolt 与 Workerman 5.0 事件驱动无关:Revolt 是纯 PHP 的 PSR 兼容协程事件循环,通过 Revolt\run() 启动单线程调度;Workerman 5.0 基于自研 ReactPHP 兼容 EventLoop,采用主从进程模型,二者接口不兼容、不可混用。

Revolt 的事件驱动不是 Workerman 5.0 的底层引擎,二者无关。
Workerman 5.0 使用的是自己实现的 ReactPHP 兼容事件循环(基于 stream_select 或 libevent / libev 扩展),而 Revolt 是一个独立的、纯 PHP 实现的现代事件循环库,与 Workerman 没有代码依赖或架构继承关系。
Revolt 事件循环怎么跑起来的?
它靠 Revolt\EventLoop 提供统一入口,本质是单线程协作式调度器:注册回调、等待 I/O 就绪、触发回调。不依赖扩展,但启用 ext-uv 或 ext-event 时会自动切换为高性能后端。
-
Revolt\run()是启动主循环的唯一方式,不能重复调用;调用后即阻塞,直到所有任务完成或显式调用Revolt\stop() - 不支持多线程并发,也不模拟“虚拟线程”——PHP 层面没有真正的轻量级线程,所谓“高并发”靠的是 I/O 复用 + 协程让出控制权
- 常见误用:
sleep(1)或file_get_contents()这类同步阻塞操作会卡死整个循环,必须换为Revolt\async()包裹或改用异步客户端(如amphp/http-client)
Workerman 5.0 的事件模型长什么样?
它沿用传统 Worker 主从进程模型:Master 进程管理 Worker 子进程,每个 Worker 内部用 EventLoop 处理连接和回调。默认使用 select,开启 event 扩展后自动切到 epoll/kqueue。
- 配置项
'event_loop' => \Workerman\Events\Select::class可显式指定循环实现,但不接受Revolt\EventLoop实例——接口不兼容 - Workerman 的“事件”是连接生命周期事件(
onConnect、onMessage),不是 Revolt 那种通用的定时器/I/O/信号事件抽象 - 混用风险高:在 Workerman 回调里直接调用
Revolt\run()会导致嵌套循环、资源泄漏甚至进程僵死
为什么有人觉得它们像?
因为都用了“事件驱动”这个词,且目标都是提升 PHP 的 I/O 并发能力。但设计哲学不同:Workerman 重稳定、易部署、适合长连接服务;Revolt 轻量、强调标准兼容(PSR-18/20)、适合命令行工具或嵌入式异步逻辑。
- 性能差异明显:纯 PHP 的
Revolt\EventLoop在万级连接下吞吐低于启用libevent的 Workerman - 兼容性陷阱:Revolt 要求 PHP ≥ 8.1,且部分协程特性(如
async函数)需ext-fiber;Workerman 5.0 支持 PHP 7.4+,对扩展依赖更宽松 - 错误现象举例:
Fatal error: Uncaught Revolt\Exception\InvalidStateException: Event loop is already running—— 很可能是在 Workerman 的onWorkerStart里误调了Revolt\run()











