swoole多端口监听关键在于协议分离与独立回调:必须用listen()创建port对象并分别set协议、挂on事件,不可依赖addlistener或共用on('receive')判端口。

直接上结论:Swoole 多端口监听不是「加几个 addlistener 就完事」,关键在协议分离和回调归属——否则所有端口数据挤在同一个 on('receive') 里,靠 connection_info 判端口,一来逻辑混乱,二来容易漏判、错判(比如 UDP 的 $from_id 和 TCP 的 $reactor_id 含义不同)。
用 listen() 替代 addlistener() 才能真正分协议
老版本文档常写 addlistener,但它只支持基础 socket 类型(TCP/UDP),无法绑定独立协议或回调。从 Swoole 1.8.0 起,listen() 返回一个 Port 对象,这才是现代多端口的正确入口。
-
addlistener只能复用主服务的协议配置(比如主服务是 TCP,它加的 TCP 端口也走同一套包解析逻辑),没法单独开 HTTP 或 WebSocket -
listen()返回的$port可调set()协议参数、可挂独立on('receive')/on('request')/on('open') - 必须在
$server->start()前调用,且不能对已启动的Port再设协议(会静默失败)
open_http_protocol 和 open_websocket_protocol 不能混用在同一个 Port
常见错误:给一个 Port 同时设 'open_http_protocol'=>true 和 'open_websocket_protocol'=>true ——Swoole 不支持,HTTP 和 WS 是互斥协议层,强行开启会导致握手失败(如 Sec-WebSocket-Key 校验跳过或重复解析)。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- HTTP 端口:只设
'open_http_protocol'=>true,挂on('request') - WebSocket 端口:只设
'open_websocket_protocol'=>true,挂on('open')+on('message') - 纯 TCP 端口:不设任何
open_*,靠on('receive')自己解析,或配'open_length_check'=>true等包格式
SSL 端口必须用 SWOOLE_SOCK_TCP | SWOOLE_SSL 且配证书路径
只写 SWOOLE_SSL 会报错:Invalid socket type;漏配证书文件则连接直接断开,日志里只显示 ssl handshake failed,没具体原因。
-
$port->set(['ssl_cert_file'=>'/path/to/cert.pem','ssl_key_file'=>'/path/to/key.pem'])路径必须绝对,相对路径不生效 - 证书需 PEM 格式,私钥不能带密码(否则启动时报
ssl key file invalid) - UDP 不支持 SSL,
SWOOLE_SOCK_UDP | SWOOLE_SSL会触发断言失败
最容易被忽略的是:每个 Port 的 on() 回调函数签名可能不同——HTTP 的 on('request') 是 function($request, $response),而 TCP 的 on('receive') 是 function($server, $fd, $reactor_id, $data)。传错参数或混用变量名,运行时直接报 Undefined variable 或 Call to a member function on null。










