0

0

Workerman启动时报”Addressalreadyinuse”怎么办_端口占用处理技巧【技巧】

看不見的法師

看不見的法師

发布时间:2026-03-13 22:46:07

|

355人浏览过

|

来源于php中文网

原创

Workerman 启动报“Address already in use”需先定位占用端口的进程:Linux/macOS用lsof -i :端口号或netstat -tulnp | grep,Windows用netstat -ano | findstr;再检查Workerman残留子进程并彻底清理,同步更新register地址与客户端配置,开发环境可临时启用SO_REUSEADDR缓解TIME_WAIT问题。

workerman启动时报”addressalreadyinuse”怎么办_端口占用处理技巧【技巧】

Workerman 启动报 Address already in use 怎么快速定位是谁占的端口

这个错误本质是 Linux/Unix 系统级提示:你要 bind 的端口(比如 2345)已经被另一个进程占了,Workerman 拿不到控制权。别急着 kill -9,先搞清谁在用。

常用排查命令(Linux/macOS):

  • lsof -i :<port></port>(例如 lsof -i :2345),直接列出占用该端口的进程 PID 和命令名
  • netstat -tulnp | grep :<port></port>(需要 root 权限才显示 PID/程序名)
  • Windows 下用 netstat -ano | findstr :<port></port>,再用 tasklist | findstr <pid></pid> 查进程名

注意:lsof 在某些最小化系统(如 Alpine)默认没装,得先 apk add lsof;Workerman 默认监听 0.0.0.0:2345,查的时候别漏掉 0.0.0.0::(IPv6)地址变体。

Workerman 重启后仍报端口占用,大概率是子进程没干净退出

Workerman 是多进程模型,主进程 fork 出多个 worker 进程。如果上次异常退出(比如 kill -9 主进程、断电、OOM killer 干掉子进程),部分子进程可能还在后台跑着,继续占着端口。

  • 先用 ps aux | grep workerman 看有没有残留的 php 进程(尤其是带 WorkerMan 或你项目路径的)
  • 别只 kill 主进程 PID,要连带干掉所有相关子进程:kill -9 $(pgrep -f "YourAppPath/start.php")
  • 更稳妥的做法:启动前加清理逻辑,比如在 start.php 开头加 exec("killall -u $(whoami) php 2>/dev/null");(仅测试环境,生产慎用)

常见陷阱:你以为 restart 成功了,其实旧 worker 还活着,新 worker 启动失败,日志里只写一句 Address already in use,根本不会告诉你“有 3 个旧进程卡在 ESTABLISHED 状态”。

吐槽大师
吐槽大师

吐槽大师(Roast Master) - 终极 AI 吐槽生成器,适用于 Instagram,Facebook,Twitter,Threads 和 Linkedin

下载

想换端口?别只改 $worker->listen,还要检查 register 地址和客户端配置

Workerman 常用两层结构:业务 worker 监听客户端请求,register worker(注册中心)负责进程管理。改一个地方,另一处可能还卡在旧端口。

  • 业务 worker 端口在 $worker = new Worker("text://0.0.0.0:<port>");</port> 里改
  • register worker 默认走 127.0.0.1:1236,改法是启动时传参:php start.php start -d --register-addr=127.0.0.1:<new_port></new_port>
  • 如果你用 GatewayWorker,Gateway 类构造时的 $gateway = new Gateway("websocket://0.0.0.0:<port>");</port>$gateway->registerAddress 属性必须同步更新
  • 客户端连接代码(JS / APP)里硬编码的端口也得同步改,否则连不上不是报错,是超时

端口改完不生效?八成是 register 地址没对齐,Workerman 主进程会反复尝试连 register,连不上就卡住,最后才抛出端口错误——它只是表象,根源在通信链路断了。

开发机上频繁启停,可以临时启用 SO_REUSEADDR 避免 TIME_WAIT 卡端口

Linux 下 socket 关闭后会进入 TIME_WAIT 状态(默认 60 秒),期间端口不可重用。开发时高频重启,很容易撞上这个窗口期。

  • Workerman 本身不直接暴露 socket 选项,但可以在创建 Worker 实例后手动设置:
    $worker = new Worker('tcp://0.0.0.0:2345');
    $worker->onWorkerStart = function($worker) {
        if (isset($worker->socket)) {
            socket_set_option($worker->socket, SOL_SOCKET, SO_REUSEADDR, 1);
        }
    };
  • 注意:这只能缓解开发场景,不能解决真正被其他进程长期占用的问题
  • 生产环境禁用此设置,SO_REUSEADDR 可能导致旧连接残包干扰新连接,尤其在负载高、网络不稳定时

真正难处理的是那些不释放端口的“幽灵进程”——它们不响应信号、不写日志、不报错,只安静地把端口焊死。这种时候,lsof + strace -p <pid></pid> 才是最后一招。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
504 gateway timeout怎么解决
504 gateway timeout怎么解决

504 gateway timeout的解决办法:1、检查服务器负载;2、优化查询和代码;3、增加超时限制;4、检查代理服务器;5、检查网络连接;6、使用负载均衡;7、监控和日志;8、故障排除;9、增加缓存;10、分析请求。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

608

2023.11.27

default gateway怎么配置
default gateway怎么配置

配置default gateway的步骤:1、了解网络环境;2、获取路由器IP地址;3、登录路由器管理界面;4、找到并配置WAN口设置;5、配置默认网关;6、保存设置并退出;7、检查网络连接是否正常。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

236

2023.12.07

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

254

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1089

2024.03.01

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

531

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

576

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

6255

2023.08.17

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号