channel是workerman官方推荐的轻量级进程间通信方案,基于发布/订阅模型,内置独立channel server(默认127.0.0.1:2206),无需外部依赖,支持跨服务器集群通信,适用于实时广播、任务分发等场景。

Channel 是 Workerman 官方推荐的进程间通信方案
Workerman 4.x 中,Channel 组件专为解决多进程环境下数据互通设计,比 Redis 更轻量、更原生,且支持跨服务器集群通信。它基于发布/订阅模型,不依赖外部服务,启动后自动运行一个独立的 Channel Server(默认监听 127.0.0.1:2206),所有 Worker 进程作为客户端连接该服务端完成消息中转。
启用 Channel 的基本步骤
确保已安装:composer require workerman/channel
- Channel 服务端会随项目自动启动(进程名
channel-server),无需手动编写服务代码 - 所有需要通信的 Worker 进程(包括 Webman、Worker 或 HTTP Worker)都需调用
Channel\Client::connect()连接同一台 Channel Server - 连接只需执行一次,建议放在
onWorkerStart回调中,避免重复连接 - 若部署在多台机器上,必须将所有客户端指向**同一个中心 Channel Server 地址**(如
192.168.1.100:2206),不能各自启动本地服务
发布与订阅数据的典型写法
事件名可自由定义(推荐语义化,如 user_login、order_paid),数据支持数组、字符串、数字等 PHP 原生类型:
-
发布消息:任意进程调用
Channel\Client::publish('event_name', $data) -
订阅消息:在目标进程的
onWorkerStart中注册回调:Channel\Client::on('event_name', function($data) { /* 处理逻辑 */ }) - 同一个事件可被多个进程同时订阅,适合广播或分发任务
- 若需定向推送(如只通知某 Worker 的特定连接),可在
$data中携带worker_id或connection_id,由接收方自行判断处理
常见注意事项
Channel 不是共享内存,而是消息中转机制,因此:
- 消息不保证顺序,也不保证必达(无持久化),适合实时性要求高、允许少量丢失的场景(如在线状态同步、聊天广播)
- 不要在
onMessage或高频回调中频繁 publish 大体积数据,可能影响性能 - Channel Server 是单点,生产环境建议加简单监控(如检测端口是否存活),必要时可做主备切换
- 调试时可用
netstat -an | grep 2206确认服务端是否正常监听,用telnet 127.0.0.1 2206测试连通性











