Hyperf不是与Swoole并列的选项,而是重度依赖Swoole协程的全栈框架;其优势在于企业级微服务能力(如DI、AOP、服务治理),代价是启动慢、内存高、调试复杂。

没有“哪个好”,只有“哪个更匹配你的当前项目”。Hyperf 是 Swoole 的上层框架,不是和 Swoole 并列的选项;Workerman 和 Swoole 才是真正可比的底层运行时。选错层级,后面踩坑会非常直接。
Hyperf 不是和 Swoole 并列的框架,而是重度依赖 Swoole 协程的全栈框架
Hyperf 的核心能力(如 Co\MySQL、Co\Redis、协程 HTTP 客户端)全部来自 Swoole 扩展。它不提供独立的网络层,也不兼容纯 PHP 环境。如果你没装 swoole.so,composer install hyperf/hyperf 会成功,但启动就报 Class 'Swoole\Coroutine' not found。
它的优势集中在企业级微服务场景:
- 开箱即用的
@Inject依赖注入和@Aspect切面,适合中大型团队统一治理逻辑 - 内置服务注册(Consul/Etcd)、熔断器(
hyperf/circuit-breaker)、分布式配置(hyperf/config-center) - HTTP + WebSocket + RPC(JSON-RPC/gRPC)共用同一套协程生命周期,避免跨框架状态同步问题
代价也很明确:内存占用比裸 Swoole 高 30%~50%,启动慢(需扫描注解+构建 DI 容器),调试时堆栈深、Xdebug 跳转多层。
Workerman 适合「快速上线、运维敏感、团队 PHP 基础强但无 C 扩展经验」的项目
常见错误现象:php start.php start -d 启动后,ps aux | grep workerman 看不到子进程 —— 实际是 Master 进程没权限 fork,或 pcntl 扩展未启用。Workerman 不报错,只静默失败。
它真正省心的地方在于部署链路极短:
- 只要 PHP 8.1+、
pcntl和posix开启(绝大多数 Linux 默认满足),composer require workerman/workerman后就能跑 -
file_get_contents('http://api.example.com')在 Worker 进程里仍会阻塞,但你本就不该这么写;Workerman 明确要求用Workerman\Lib\AsyncTcpConnection或workerman/http-client异步发请求 - 热更新只需改代码 +
php start.php reload,Master 会平滑杀掉旧 Worker,新 Worker 加载新代码,连接不中断(WebSocket 除外)
不适合的场景:需要大量串行 I/O(比如查 Redis → 调第三方 HTTP → 写 MySQL),回调嵌套会让逻辑迅速失控。
Swoole 是性能上限高、但容错门槛也高的底层引擎
关键判断点:你的瓶颈是不是在 I/O 密度?如果单机并发稳定在 5k 以上,或平均每个请求要串行打 3 次以上外部服务,Swoole 协程带来的吞吐提升是实打实的。否则,Workerman 更稳。
容易被忽略的硬约束:
- Swoole 5.x 已放弃对 PHP 7.4 及以下支持,而部分政企客户服务器仍卡在 CentOS 7 + PHP 7.3
- Docker 构建时,
docker-php-ext-install swoole可能失败,常见于 Alpine 镜像(缺g++和linux-headers)或 PHP 主版本与 Swoole 版本不匹配 - 协程内未捕获异常(比如
throw new Exception())会直接终止当前协程,但不会 kill 进程——这导致错误日志里看不到堆栈,监控指标却悄悄下跌
别迷信“协程自动非阻塞”:你在 go(function () { sleep(1); }) 里写 sleep,照样阻塞整个进程。Swoole 的协程调度只接管了它自己封装的 I/O 函数(如 Co\MySQL::query),不接管 PHP 原生函数。
混合使用的现实路径比“二选一”更常见
很多团队实际走的是渐进路线:核心网关、实时推送用 Swoole(或 Hyperf),管理后台、定时任务、低频 API 用 Workerman。两者可通过消息队列(如 Redis Stream 或 Kafka)通信,避免耦合。
Webman 是个值得注意的中间态:它基于 Workerman,但通过 workerman/webman-framework 提供了类似 Laravel 的路由和中间件机制,又保留了 Workerman 的部署简易性。如果你需要 MVC 风格开发但不想碰 Swoole 协程模型,Webman 比强行在 Workerman 里套 Hyperf 更合理。
最终卡点往往不在性能数字,而在团队能否在一周内定位出 Co\Http\Client 超时未设置导致的协程泄漏,或能否接受 workerman/http-client 返回的 Promise 对象必须手动 ->onSuccess 处理。选型本质是选维护成本。


















