channel是swoole协程间同步通信的唯一原生机制,支持阻塞/非阻塞读写、超时控制与容量限制;创建需显式指定缓冲区大小(0为同步通道),push/pop操作需注意数据类型安全及异常处理,close后不可逆且影响所有未完成操作。

在Swoole协程环境中,当多个协程需要安全共享数据或协调执行顺序时,必须避免直接操作全局变量或PHP原生资源——Channel是唯一被设计用于协程间同步通信的原生通道机制,它天然支持阻塞/非阻塞读写、超时控制与容量限制。
创建并初始化Channel
调用 Swoole\Coroutine\Channel 构造函数,传入整数参数指定缓冲区大小;若传入0,则创建无缓冲通道(即同步通道),每次写入必须等待另一协程执行对应读取才能返回。
这一步不可省略:未指定容量的Channel默认容量为1,但显式声明能避免后续逻辑因隐式容量引发的阻塞意外。
【容量为0时写入会永久挂起,除非有其他协程正在读取】
向Channel写入数据
使用 $channel->push($data) 写入任意PHP变量(包括资源对象,但注意句柄生命周期)。
若Channel已满,该方法会挂起当前协程直至有空位;若设定了超时时间(如 push($data, 1.5)),超时后抛出 Swoole\Exception 异常,需用 try/catch 捕获处理。
这一步操作起来很简单,直接把数据丢进去就行,但要注意:字符串、数组、对象均可安全传递,而闭包、资源类型(如 MySQLi 连接)可能在接收协程中失效。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
从Channel读取数据
方法一:阻塞读取
调用 $channel->pop(),若通道为空则挂起当前协程,直到有数据写入。
方法二:带超时读取
传入浮点数秒数: $channel->pop(2.0),超时返回 false,不抛异常。
方法三:非阻塞尝试读取
传入 0 作为超时值:$channel->pop(0),立即返回数据或 false,适合轮询场景。
【pop() 返回 false 并不一定表示通道关闭,也可能是超时或暂无数据】
关闭Channel并检测状态
第一步:调用 $channel->close() 主动关闭通道。
第二步:关闭后所有未完成的 push 将立即失败并抛出异常,所有阻塞中的 pop 将立即返回 false。
第三步:可通过 $channel->isEmpty() 和 $channel->isFull() 实时判断内部状态,但这两个方法仅反映当前缓存情况,不体现是否已关闭。
注意:close 不可逆,重复调用会触发警告;关闭后仍尝试 push 会导致协程崩溃。










