windows下必须用swow而非swoole,因swoole官方不支持windows原生协程,即使加载扩展也会显示coroutine=>disabled;hyperf需将config/autoload/swoole.php中'driver'=>'swow',并确保php≥8.1、已手动安装swow扩展且php--ri swow验证通过。

Windows 下必须用 Swow,别试 Swoole
Windows 原生不支持 Swoole 的协程调度,哪怕你装了 swoole 扩展,php --ri swoole 显示已加载,coroutine => disabled 也会一直存在。这不是配置问题,是 Swoole 官方明确不支持 Windows 原生环境。强行启动 Hyperf 会报错:Coroutine is not enabled 或直接 panic。WSL2 是绕过该限制的唯一官方路径;若坚持纯 Windows(比如公司策略禁用 WSL),swow 是唯一可行选择。
Swoole 和 Swow 的扩展安装方式完全不同
swoole 是 C 扩展,必须通过 pecl install swoole 或编译安装,并在 php.ini 中写入 extension=swoole;而 swow 同样是 C 扩展,但目前没有 pecl 包,需手动下载预编译二进制或源码编译,再配 extension=swow。两者都不能靠 composer require swoole/swoole 装出来——那只是空壳 IDE 辅助包,运行时完全无效。
- 验证 Swoole:运行
php --ri swoole,确认输出中含coroutine => enabled - 验证 Swow:运行
php --ri swow,确认version≥ 1.5.0 且无 fatal error - PHP 版本必须 ≥ 8.1,否则
swow加载失败或协程行为异常
Hyperf 配置里只改一个字段就能切换驱动
Hyperf 默认走 Swoole,但切 Swow 只需修改 config/autoload/swoole.php 中的 'driver' => 'swow'。注意不是注释掉 Swoole 相关配置,也不是删掉 swoole 扩展——Hyperf 启动时会自动检测已加载的协程扩展,优先使用配置项指定的那个。如果误把 driver 写成 swoole 却没装 Swoole 扩展,会报 Driver "swoole" not found;反之,写 swow 却没装 Swow,则报 Driver "swow" not found。
- Swow 驱动下,
swoole.enable_coroutine这类 ini 项无效,不用管 - Swow 不依赖
opcache.enable_cli=0,但禁用它仍是推荐做法,避免热重载冲突 - watcher 热重载在两种驱动下都可用,无需额外适配
性能差异在单机开发阶段几乎感知不到
Swow 启动略快、内存占用略低,Swoole 生态更成熟、文档更全,但对本地开发来说,二者响应时间、调试体验、组件兼容性几乎一致。真正影响体验的是扩展是否装对、PHP 版本是否合规、driver 配置是否匹配已加载扩展——而不是“选哪个更快”。线上压测才需关注吞吐与长连接稳定性,开发阶段优先保证能跑起来。
最容易被忽略的一点:很多人改完 config/autoload/swoole.php 就以为切换成功了,却忘了检查 php --m | grep -E '(swoole|swow)' 确认对应扩展真实存在。配置和扩展不匹配,是本地启动失败最常见原因。











