workerman 5.2.3 监听多个端口需创建多个 worker 实例,每个实例绑定唯一地址+端口;推荐方式一(独立实例)实现 http/websocket/tcp 混合部署,方式二(动态监听)适用于跨协议通信且需启用 reuseport。

Workerman 5.2.3 监听多个端口,核心原则没变:一个 Worker 实例只绑定一个地址+端口,要监听多个端口,就得创建多个 Worker 实例。这是最稳定、最清晰、兼容性最好的方式,不依赖 PHP 版本,也不用处理复用冲突。
下面分两种常用场景说明,直接可用:
方式一:多个独立 Worker 实例(推荐)
适合 HTTP + WebSocket + TCP 混合部署,各协议完全隔离,配置自由。- 每个 Worker 显式指定完整协议和端口,例如
'http://0.0.0.0:8080'、'websocket://0.0.0.0:2346'、'tcp://127.0.0.1:5566' - 各自设置
count进程数,按协议负载分配(HTTP 可设 4,TCP 短连接可设 8) - 回调函数(
onMessage、onConnect等)互不干扰,写在对应实例里即可 - 所有实例定义完,统一调用
Worker::runAll()启动
示例代码:
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';
$http = new Worker('http://0.0.0.0:8080');
$http->count = 4;
$http->onMessage = function($connection, $data) {
$connection->send("HTTP OK");
};
$ws = new Worker('websocket://0.0.0.0:2346');
$ws->count = 2;
$ws->onMessage = function($connection, $data) {
$connection->send("WS echo: $data");
};
$tcp = new Worker('tcp://127.0.0.1:5566');
$tcp->count = 8;
$tcp->onMessage = function($connection, $data) {
$connection->send("TCP received: " . strlen($data) . " bytes");
};
Worker::runAll();
方式二:主 Worker 启动后动态监听(需共享内存)
适合需要跨协议通信的场景,比如 HTTP 请求触发向 WebSocket 客户端广播。- 必须在
onWorkerStart回调中调用$inner_worker->listen() - 动态创建的 Worker 不继承父 Worker 的
count,它只在当前子进程内生效 - 若多个子进程都要监听同一端口(如都监听
:2016),PHP ≥ 7.0 必须加$inner_worker->reusePort = true - 否则会报
Address already in use错误
示例片段:
$main = new Worker('text://0.0.0.0:2015');
$main->count = 4;
$main->onWorkerStart = function($worker) {
$inner = new Worker('http://0.0.0.0:2016');
$inner->reusePort = true; // 关键:PHP 7.0+ 必须开启
$inner->onMessage = function($conn, $data) {
$conn->send("Dynamic HTTP on 2016");
};
$inner->listen(); // 在此调用,不能放全局
};
Worker::runAll();
注意事项
- 端口被占用、防火墙拦截、IP 绑定错误(如用 `127.0.0.1` 却从外网访问)是常见失败原因,优先检查 - `reusePort = true` 仅解决多进程监听同一端口的问题,不是监听多端口的必需项 - Workerman 5.2.3 已全面支持 PHP 7.4–8.3,上述写法全部适用,无需额外适配不复杂但容易忽略。











