enable_coroutine是server实例级配置,必须在start()前通过set()显式设置为true/false;它控制回调是否自动运行于协程中,与runtime::enablecoroutine(控制同步函数hook)相互独立,需配合使用才能实现完整协程io。

enable_coroutine 不是“开启”就能用的开关,它必须在 Server 初始化后、start() 前通过 $server->set() 配置,且仅对当前 Server 实例生效。
enable_coroutine 必须在 set() 中配置
很多人误以为在 php.ini 里设 swoole.enable_coroutine = On 就能全局开启协程——这是错的。该 php.ini 选项只控制 Swoole 扩展是否允许启用协程(底层能力),不决定具体 Server 是否启用内置协程环境。
-
enable_coroutine是 Server 构造后的运行时配置项,只接受true或false,不能传字符串或数字 - 必须在
$server->start()之前调用$server->set([...]),否则无效 - 如果用的是
Swoole\Coroutine\Server,它默认仍需显式设置enable_coroutine => true,否则 recv/send 仍是阻塞的 - 未设置时,默认为
true(Swoole 4.4+),但依赖这个默认值容易踩坑,建议显式写出
enable_coroutine 和 Runtime::enableCoroutine 的区别
enable_coroutine 控制 Server 回调(如 onRequest、onReceive)是否自动运行在协程中;而 Swoole\Runtime::enableCoroutine() 控制同步函数(如 file_get_contents、cURL、MySQLi)是否被协程 Hook 化。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 只开
enable_coroutine => true,但没调Swoole\Runtime::enableCoroutine(true):回调进协程了,但你在里面调file_get_contents()仍会阻塞整个协程 - 只调
Swoole\Runtime::enableCoroutine(true),但enable_coroutine => false:回调在同步上下文中执行,file_get_contents()被 Hook 后也无意义(因为没协程调度器) - 两者通常要一起用:
enable_coroutine => true+Swoole\Runtime::enableCoroutine()才构成完整协程 IO 环境
task_enable_coroutine 是独立开关
Task 进程里的协程环境由 task_enable_coroutine 单独控制,和主 Server 的 enable_coroutine 无关。
- 即使
enable_coroutine => false,只要task_enable_coroutine => true,onTask里仍可直接用Swoole\Coroutine\MySQL - 该配置默认为
true,但若你关了主 Server 协程,又忘了开这个,onTask中调协程客户端就会报Co::getuid() === 0错误 - 常见错误信息:
Fatal error: Uncaught Swoole\Exception: must be called in the coroutine,基本就是这个原因
真正容易被忽略的是:enable_coroutine 是 Server 实例级配置,不是进程级、也不是全局。多个 Server(比如 HTTP + WebSocket 共存)必须各自 set,漏一个就退化成同步阻塞行为。










