swoole 4.x 支持单 httpserver 实例多端口监听,主端口(如9501)处理 http,listen 新增端口(如9502)配置 open_websocket_protocol=>true 专用于 websocket,共用进程与内存,无需多进程部署。

可以,Swoole 4.x 完全支持同一个 Swoole\Http\Server 实例同时监听多个端口,并为不同端口分配不同协议(如 HTTP 和 WebSocket),无需启动多个 Server 进程。
核心方式:用 listen() 添加独立端口并单独设置协议与回调
HTTP Server 主实例默认处理 HTTP 协议;通过 $server->listen() 新增的端口可独立配置为 WebSocket 协议,关键在于启用 open_websocket_protocol => true 并绑定自己的 on('open')、on('message') 等事件。
- 主端口(如 9501)保持 HTTP 协议,处理网页请求、API 接口等
- 新增端口(如 9502)设为 TCP + WebSocket 协议,专用于长连接通信
- 两个端口共用同一进程、同一内存空间,可直接共享变量、协程上下文或 Channel
代码示例(Swoole 4.5+ 推荐写法)
以下是一个完整、可运行的多端口 Http + WebSocket 示例:
WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。
$http = new Swoole\Http\Server('0.0.0.0', 9501);
// 主端口:HTTP 服务
$http->on('request', function ($request, $response) {
if ($request->server['request_uri'] === '/api/status') {
$response->header('Content-Type', 'application/json');
$response->end(json_encode(['status' => 'ok']));
} else {
$response->status(404);
$response->end('Not Found');
}
});
// 新增端口:WebSocket 服务(9502)
$ws = $http->listen('0.0.0.0', 9502, SWOOLE_SOCK_TCP);
$ws->set([
'open_websocket_protocol' => true,
'websocket_subprotocol' => 'chat-v1',
]);
$ws->on('open', function ($server, $req) {
echo "WebSocket client #{$req->fd} connected\n";
});
$ws->on('message', function ($server, $frame) {
$server->push($frame->fd, "Echo: {$frame->data}");
});
$http->on('start', function ($server) {
echo "HTTP server listening on http://0.0.0.0:9501\n";
echo "WebSocket server listening on ws://0.0.0.0:9502\n";
});
$http->start();
注意事项与常见问题
实际部署时需注意以下几点,避免踩坑:
-
不能混用协议于同一端口:一个端口只能走一种协议。若想在 9501 同时支持 HTTP 和 WebSocket,需借助路由判断升级请求(即标准 WebSocket 握手),但 Swoole\Http\Server 默认已自动处理该逻辑 —— 只要客户端发起
Upgrade: websocket请求,就会触发on('open')而非on('request') -
SSL 支持需显式开启:若 WebSocket 需 wss,监听端口时应使用
SWOOLE_SOCK_TCP | SWOOLE_SSL,并设置证书路径 -
端口冲突检查:确保目标端口未被占用,Linux 下可用
lsof -i :9502查看 - 防火墙放行:云服务器需在安全组中开放 9501 和 9502 端口(TCP)
验证是否生效
启动后可通过以下方式快速验证:
- 浏览器访问
http://your-server:9501/api/status→ 应返回 JSON - 用 WebSocket 客户端(如 wscat 或 JS 的
new WebSocket('ws://your-server:9502'))连接 → 应成功握手并收发消息 - 查看终端输出日志,确认两条监听信息均已打印
这种方式轻量、高效,是构建混合型实时服务(如后台管理 + 用户聊天)的标准实践。










