Workerman启动报“端口被占用”本质是目标端口已被其他进程占用,需先用lsof -i :端口(Linux/macOS)或netstat -ano | findstr :端口(Windows)定位进程,再kill -9 PID或taskkill /F /PID终止,或修改Worker监听地址为未占用端口并确保防火墙/安全组放行。

Workerman 5.2.3 启动时报“端口被占用”,本质是目标端口(比如 2345、8080)正被其他进程使用,Workerman 无法绑定。解决思路很直接:查清谁占了端口,再决定是杀掉它,还是换端口启动。
确认哪个进程占用了端口
在终端执行命令快速定位:
- Linux/macOS:
lsof -i :端口号(如lsof -i :2345),或netstat -tulnp | grep :端口号 - Windows:
netstat -ano | findstr :端口号,再用tasklist | findstr PID号查进程名
注意:Linux/macOS 需要 root 权限才能看到其他用户的进程,可加 sudo;Windows 中如果提示权限不足,建议以管理员身份运行命令提示符或 PowerShell。
终止占用端口的进程
确认是无关或已卡死的进程后,可安全终止:
- Linux/macOS:
kill -9 PID(PID 是上一步查到的数字) - Windows:
taskkill /F /PID PID号
常见干扰源包括:上次未正常退出的 Workerman 实例、其他 PHP 服务(如 Swoole 调试服务)、Node.js 本地服务器、IDE 自带的调试服务(如 PHPStorm 的内置 Web Server)。
修改 Workerman 监听端口(推荐用于开发环境)
如果不想动系统进程,或需多实例并行,改端口最稳妥。在 Worker 初始化代码中调整:
$worker = new Worker('http://0.0.0.0:2345'); // 改成未被占用的端口,如 2346、8081
也可通过环境变量或配置文件动态传入,便于不同环境切换。记得检查防火墙或云服务器安全组是否放行新端口(尤其部署到 Linux 服务器时)。
避免端口冲突的实用习惯
Workerman 本身不自动重试或提示可用端口,靠开发者主动管理:
- 启动前加一句检测逻辑(用
socket_create+socket_bind尝试绑定,捕获失败再提示) - 生产环境统一用非特权端口(1024 以上),避免与系统服务冲突
- 用
php start.php stop正常停止,而非直接 Ctrl+C 或 kill -9,减少残留进程 - 开发时可在启动脚本里加
echo "正在监听端口 2345...",配合ps aux | grep workerman快速核对
不复杂但容易忽略。

















