协程栈由PHP栈(默认8KB)和C栈(默认2MB)组成,需分别配置:PHP栈通过Coroutine::set(['stack_size'=>...])设置,影响zval和PHP调用帧;C栈需编译时或环境变量SWOOLE_C_STACK_SIZE调整,超限直接崩溃。

协程栈大小默认是 8KB,但实际由 PHP 栈 + C 栈组成
很多人以为 stack_size 就是整个协程的内存开销,其实 Swoole 4.0+ 使用双栈模型:PHP 栈(默认 8KB)用于保存 zval 和 PHP 函数调用帧,C 栈(默认 2MB)用于底层 C 函数调用(如 array_map、call_user_func)。两者独立配置,且用途不同。
常见误区是只调大 stack_size,却忽略 C 栈溢出导致的段错误或静默崩溃——尤其在深度递归、大量嵌套回调或使用某些扩展函数时。
设置 PHP 栈大小:用 Swoole\Coroutine::set(['stack_size' => ...])
这个参数控制的是 PHP 层面的栈空间,单位是字节。它影响的是局部变量、函数调用链、ob_start 缓存等 PHP 运行时结构。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 默认值为
8192(即 8KB),对大多数业务足够 - 若遇到
Fatal error: Allowed memory size exhausted或Segmentation fault且堆栈较深,可尝试设为65536(64KB) - 不能设得过大(如 >256KB),否则单协程内存占用飙升,
max_coroutine实际并发数会严重缩水 - 必须在
Swoole\Coroutine::run()或 Server 启动前调用,运行中修改无效
调整 C 栈大小:需编译时指定或通过环境变量
C 栈大小不通过 PHP 配置项暴露,而是由 Swoole 编译时的 --with-coroutine-stack-size 决定,默认 2MB。运行时无法动态修改,但可通过以下方式间接控制:
- 启动前设置环境变量:
export SWOOLE_C_STACK_SIZE=4194304(4MB),适用于已预编译的 Swoole 包 - 源码编译时加参数:
./configure --with-coroutine-stack-size=1048576(1MB) - 注意:C 栈使用虚拟内存(mmap),不立即占用物理内存;但超限时会直接 crash,无 PHP 层错误提示
- 调试时可用
ulimit -s检查系统线程栈限制,避免与 C 栈冲突
怎么判断栈是否真不够?看错误现象和日志
栈不足的表现往往隐蔽,不能只盯 PHP 错误。重点关注:
- 进程突然退出,
dmesg显示segfault at ... ip ... sp ... error 6 in swoole.so - 协程内调用
json_encode多层嵌套数组时失败,或ob_start后输出异常截断 - 启用
SWOOLE_LOG_LEVEL=5后日志中出现alloc stack: size=..., ptr=(nil)或分配失败提示 - 用
strace -e trace=mmap,munmap观察协程创建时是否频繁 mmap 失败
真正需要调栈大小的场景极少,多数“内存高”问题其实是协程未及时结束、Redis/MySQL 连接未 close、或 GC 延迟导致——栈只是表象,别一上来就加。

















