“address already in use”表明指定端口被其他进程占用,需用netstat或lsof查pid后kill -9释放,或修改start.php中监听端口并同步更新register地址。

Workerman启动时报“Address already in use”,说明你指定的监听端口已被其他进程占用,无法绑定,服务直接失败——这不是配置错误,而是系统级资源冲突,必须立刻释放或绕过该端口才能继续调试或上线。
确认哪个端口被占用了
打开终端,执行:netstat -tuln | grep :<strong>【你配置的端口号】</strong>。比如你配置的是 websocket://0.0.0.0:2346,就查 grep :2346。
如果返回结果为空,说明该端口当前没被监听;如果有输出,记下最后一列的 PID(如 12345),这就是罪魁祸首的进程号。
Windows 用户请改用:netstat -ano | findstr :<strong>【你配置的端口号】</strong>,同样找最后一列的 PID。
快速杀掉占用进程(Linux/macOS)
方法一:直接终止进程
执行:kill -9 <strong>【上面查到的PID】</strong>。这会强制结束该进程,释放端口。
方法二:一键查杀(更省事)
执行:lsof -ti:2346 | xargs kill -9(把 2346 换成你的实际端口)。这条命令自动查 PID 并杀,不用手动抄写。
注意:如果占用进程是你正在跑的另一个 Workerman 实例,kill 后它会彻底退出,无法恢复连接。
快速杀掉占用进程(Windows)
执行:taskkill /F /PID <strong>【上面查到的PID】</strong>。/F 表示强制终止,/PID 后紧跟数字,不能带空格。
如果提示“拒绝访问”,说明你没用管理员权限运行命令行——右键“命令提示符”或 PowerShell,选“以管理员身份运行”,再试一次。
不杀进程,直接换端口启动(推荐开发阶段)
第一步:打开你的 Workerman 启动文件(通常是 start.php 或 start_io.php)
第二步:找到类似 $worker = new Worker('websocket://0.0.0.0:2346'); 这一行
第三步:把冒号后面的数字改成一个未被占用的端口,比如 2347、8081 或 9501
⚠️ 关键点:register worker 的端口也必须同步改。如果你用了 Workerman 的注册中心模式(常见于 chat、gateway 等架构),RegisterWorker 默认监听 1236,它和业务 worker 的端口是两套,漏改会导致 gateway 无法注册,客户端连不上。
改完保存,执行:php start.php start(前台调试)或 php start.php start -d(后台守护)。











