监听地址必须为tcp://0.0.0.0:端口,写127.0.0.1、仅端口号或局域网IP均导致外部无法连接;改后须php start.php stop && start完整重启,并用ss -tuln验证0.0.0.0:端口生效。

监听地址必须写成 tcp://0.0.0.0:端口号,写成 127.0.0.1 或只写端口会导致外部客户端根本连不上——不是代码没响应,是内核直接丢包。
tcp://0.0.0.0:端口 是唯一能对外服务的写法
Workerman 的 Worker 构造函数第一个参数就是监听地址,协议和 IP:端口必须拼成完整 URI 格式。常见错误包括:
- 写成
'tcp://127.0.0.1:2345':只监听回环,局域网/外网设备发包过来,Linux 内核不转发,onConnect和onMessage都不会触发 - 写成
'2345'或2345:Workerman 会默认当成tcp://127.0.0.1:2345,等效于上一条 - 写成
'tcp://192.168.1.100:2345':仅绑定该网卡,其他网段或公网无法访问,调试时容易误判为“连不上”
正确示例:$worker = new Worker('tcp://0.0.0.0:2345'); ——0.0.0.0 表示监听本机所有 IPv4 网卡,包括内网、公网、回环。
改完必须完整重启,reload 不生效
Workerman 加载监听配置是在进程启动瞬间完成的,运行中修改代码后执行 php start.php reload 不会重载 Worker 构造参数。必须停掉再启动:
- 先执行
php start.php stop - 再执行
php start.php start - 检查是否生效:运行
ss -tuln | grep :2345,看到*:2345或0.0.0.0:2345才算成功;如果还显示127.0.0.1:2345,说明旧进程还在跑或代码没真正重载
云服务器还要过两道关:安全组 + 系统防火墙
即使 Workerman 监听对了,外部仍连不上,大概率卡在这两个地方:
- 阿里云/腾讯云等平台的安全组规则没放行该端口(TCP 协议,端口范围填
2345/2345,授权对象填0.0.0.0/0) - 系统级防火墙拦截:CentOS 用
firewalld,Ubuntu 用ufw,需手动放行,例如sudo ufw allow 2345 - Windows 下注意 Skype、IIS、WebStorm 内置服务常抢占 80/443/2345 等端口,
netstat -ano | findstr :2345查 PID 后用任务管理器结束
验证连通性别只靠浏览器,用 curl 或 telnet
TCP 服务没法用浏览器直接测(除非你写的是 HTTP 协议),得用底层工具确认连接是否建立成功:
- 本地测试:
telnet 127.0.0.1 2345,能进命令行表示 TCP 层通了 - 局域网其他机器测试:
telnet 192.168.x.x 2345(替换为服务器真实内网 IP) - 外网测试(确认安全组已开):
curl -v telnet://公网IP:2345或用 nc:nc -zv 公网IP 2345 - 千万别依赖浏览器地址栏输
http://ip:2345——它强制走 HTTP,而你监听的是裸 TCP,必然失败且无提示
监听地址这一步看着简单,但它是整个通信链路的第一道闸门。写错 IP、漏写协议、没重启、被防火墙拦……任意一个环节出问题,onMessage 就永远收不到数据,日志里也不会报错,只会静默失效。

















