Workerman 5.2.3 设置自定义协议端口的核心是new Worker("协议://IP:端口")初始化绑定或onWorkerStart中调用listen()动态绑定;协议名可自定义(如myproto://),需明确IP和端口,收发逻辑完全由开发者自行解析与处理。

Workerman 5.2.3 中设置自定义协议监听端口,核心是用 new Worker("协议://IP:端口") 初始化时直接指定,或在 onWorkerStart 中调用 $worker->listen() 动态绑定。自定义协议(如 text://、myproto://)本质是 TCP 层之上的应用层协议,Workerman 不做解析,由你完全控制收发逻辑。
初始化时直接绑定端口
这是最常用、最清晰的方式。只需把协议名写进 URL 字符串,Workerman 会按 TCP 模式启动监听:
- 协议名可任意命名,如
myproto、binary、msgpack,但必须以://结尾 - IP 和端口需明确,推荐用
0.0.0.0:8081(全网访问)或127.0.0.1:8081(仅本地) - 示例:
$worker = new Worker("myproto://0.0.0.0:8081");
在 onWorkerStart 中动态 listen
适用于运行时根据条件开启端口,或共享内存变量的多协议协同场景(比如 HTTP 请求触发向自定义协议客户端广播):
- 必须在
onWorkerStart回调中创建新 Worker 并调用listen() - PHP ≥ 7.0 时,若多个子进程都要监听同一端口,必须设
$inner_worker->reusePort = true - 不能在全局作用域或
onConnect等回调里调用listen(),否则无效
配套处理收发逻辑
自定义协议不依赖 Workerman 内置解析器,所有数据都原样交给你处理:
-
onMessage接收到的是原始字符串或二进制流,需自行解包(如按长度头、分隔符、固定结构等) -
onConnect可用于握手认证、分配连接 ID;onClose清理资源 - 发送时用
$connection->send($raw_data),确保格式与客户端约定一致
常见问题排查
端口未生效?重点检查这几项:
- 端口是否被其他进程占用(
lsof -i :8081或netstat -tuln | grep 8081) - Linux 下非 root 用户无法绑定 1024 以下端口(如 80、443),换高编号或加
sudo - 防火墙是否放行该端口(
ufw status/firewall-cmd --list-ports) - 协议名拼写错误(如写成
myproto:/0.0.0.0:8081少了斜杠) - SELinux 启用时可能拦截,临时关闭测试:
setenforce 0

















