Hyperf 3.2 默认启用协程,前提是 Swoole 扩展支持且配置正确:需验证 php --ri swoole 输出含 “coroutine => enabled”,server.php 中 'enable_coroutine' => true 已默认设置,无需手动调用 Runtime::enableCoroutine(),禁用 php.ini 或 ini_set 方式。

enable_coroutine 是 Swoole 的运行时配置项,不是 Hyperf 的配置,也不能在 php.ini 中用 swoole.enable_coroutine = On 这种写法(该配置项根本不存在)。
它必须在 Swoole Server 启动时通过 set() 方法显式开启,且仅对当前 Server 实例生效。Hyperf 3.2 默认已启用协程 —— 但前提是底层 Swoole 扩展本身支持,并且 Server 配置正确。
✅ 正确开启协程的方式(Hyperf 3.2 下)
Hyperf 内部使用 Swoole\Http\Server 或 Swoole\WebSocket\Server,协程能力由以下两层共同保障:
1. 确保 Swoole 扩展已启用且协程就绪
运行命令验证:
php --ri swoole | grep -i "coroutine"
输出中必须包含:
coroutine => enabled
若为 disabled,说明 Swoole 编译时未启用协程(极少见),或 PHP 版本不兼容(如用了 PHP 8.5 + Swoole 6.1 但未打补丁)。
✅ 推荐组合(低风险):Hyperf 3.2 + Swoole 6.1 + PHP 8.4
⚠️ PHP 8.5 + Swoole 6.1 当前属中高风险组合,部分环境需手动启用--enable-coroutine编译参数。
2. Hyperf 自动设置 enable_coroutine => true
Hyperf 3.2 的 server.php 配置(config/autoload/server.php)中,默认已包含:
'settings' => [
'enable_coroutine' => true,
// 其他设置...
],
这个值会透传给 Swoole Server 的 set() 方法,是真正起效的位置。
? 你不需要、也不应该手动调用
Swoole\Runtime::enableCoroutine()—— Hyperf 已在启动流程中自动完成协程运行时初始化。
3. 检查是否被意外关闭
极少数情况:你在自定义 Process、Timer 或中间件里调用了 Swoole\Runtime::enableCoroutine(false),或在非协程上下文中误用阻塞函数(如 sleep()、file_get_contents() 未协程化),会导致局部协程失效。
可加一行日志确认当前协程状态:
var_dump(Swoole\Coroutine::getCid()); // 有数字返回 → 在协程中;返回 false → 不在协程内
❌ 常见错误操作(不会生效)
- 在
php.ini写swoole.enable_coroutine = On→ 无效,Swoole 没这个 INI 选项 - 在代码里写
ini_set('swoole.enable_coroutine', '1')→ 无效 - 忘记
extension=swoole或swoole.so加载失败 → 启动直接报错,连日志都看不到
✅ 快速验证协程是否真正在工作
启动服务后,访问任意接口,在控制器中加:
public function test()
{
\Swoole\Coroutine::create(function () {
echo "协程已就绪\n";
});
return 'ok';
}
或者更直接:
public function test()
{
go(function () {
\Co::sleep(0.1);
echo "go works\n";
});
return 'triggered';
}
只要没报 Call to undefined function go() 或 Swoole\Coroutine::create(),且能输出内容,说明协程链路畅通。
不复杂但容易忽略











