Address already in use 错误表明端口被占用,需先用 ss -tuln | grep :端口验证真实监听状态,再通过 lsof -i :端口(Linux/macOS)或 netstat -ano | findstr :端口(Windows)定位并 kill 占用进程,同时清理 Workerman 残留子进程,最后确认新启动的 Workerman 成功监听 0.0.0.0:端口。

Workerman 4.0.34 启动时提示 Address already in use,说明系统拒绝绑定目标端口,必须立刻定位并清除占用进程,否则服务无法监听、客户端连接直接被拒绝。
确认端口是否真被占用
先验证错误是否真实存在,避免误判。执行 ss -tuln | grep :2345(将2345替换成你实际配置的端口),有输出才代表内核层确有监听;若无输出,问题可能出在 Workerman 自身未成功启动,而非端口冲突。
注意:【不要只看 php start.php start 的 success 提示】,该提示仅代表主进程 fork 成功,不代表 worker 进程已真正监听端口。
快速定位占用进程(Linux/macOS)
方法一:用 lsof(推荐)
执行 lsof -i :2345,直接返回进程 PID 和命令名。如果提示 command not found,说明系统未安装 lsof,Alpine 等精简镜像需先运行 apk add lsof。
方法二:用 netstat
执行 netstat -tulnp | grep :2345,需 root 权限才能显示 PID 和程序名;若权限不足,输出中将不包含 php 或 WorkerMan 字样,容易漏判。
方法三:查 IPv6 变体别遗漏
Workerman 默认监听 0.0.0.0:2345,但某些残留进程可能绑定 :::2345(IPv6 全地址)。务必补查 lsof -i6 :2345 或 ss -tuln | grep :2345 输出中是否含 ::: 行。
Windows 下排查端口占用
第一步:查端口对应 PID
执行 netstat -ano | findstr :2345,记录末尾的数字(即 PID)。
第二步:查 PID 对应进程名
执行 tasklist | findstr <上一步得到的PID>,确认是 php.exe、cmd.exe 还是其他程序。
第三步:强制结束进程
执行 taskkill /PID <PID> /F。若提示“拒绝访问”,说明该进程属于 SYSTEM 或其他用户,需以管理员身份运行命令提示符再操作。
清理 Workerman 残留子进程
① 先检查是否真有残留
执行 ps aux | grep workerman 或 ps aux | grep "start.php",重点看是否有带项目路径或 WorkerMan: worker process 字样的进程。
② 彻底杀死全部相关进程
执行 kill -9 $(pgrep -f "your-project-path/start.php")。注意替换 your-project-path 为你的实际路径,比如 /home/www/myapp/start.php。
③ 防止下次再残留(仅测试环境)
在 start.php 开头插入一行:exec("killall -u $(whoami) php 2>/dev/null");。这行代码会在每次启动前自动清理同用户下的所有 php 进程——【生产环境严禁使用】,否则可能误杀其他 PHP 应用。
验证端口已释放并重启服务
执行 ss -tuln | grep :2345,确认无任何输出。
执行 php start.php start 启动 Workerman。
再次执行 ss -tuln | grep :2345,应看到 *:2345 或 0.0.0.0:2345 行,且状态为 LISTEN。

















