Workerman心跳超时怎么关闭连接

夜涛姑娘_2809

夜涛姑娘_2809

2026-09-07

150人浏览

原创

onmessage第一行必须无条件更新lastmessagetime;定时器检查需先isconnected()再判断超时;心跳阈值应按链路最短环节设定,客户端间隔为服务端阈值的0.5倍;onclose须统一清理所有关联资源。

workerman心跳超时怎么关闭连接

onMessage里必须无条件更新lastMessageTime

客户端发来的任何原始数据,不管是不是合法JSON、有没有type字段、解析会不会报错,第一行就得更新时间戳。否则{"type":"ping"}因JSON decode失败被return,$connection->lastMessageTime就卡在旧值不动,后续检查直接误判超时。

正确写法是:

$worker->onMessage = function($connection, $msg) {
    // 第一行就更新,不加任何判断
    $connection->lastMessageTime = time();
<pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">// 后续再做业务解析
$data = json_decode($msg, true);
if (json_last_error() !== JSON_ERROR_NONE) {
    return;
}
if ($data['type'] === 'ping') {
    $connection->send(json_encode(['type' => 'pong']));
    return;
}
// 其他业务逻辑...

};

定时器检查必须带isConnected()防护

Workerman的Timer::add()

回调执行时,连接可能已在底层断开(比如对端FIN已收但PHP还没触发onClose),此时直接调$connection->close()会抛warning甚至崩溃。

检查逻辑必须加两层防护:

  • $connection->isConnected()确认连接当前可操作
  • time() - ($connection->lastMessageTime ?? 0) > $timeout判断是否真超时

示例:

<pre class="brush:php;toolbar:false;">Timer::add(45, function() use ($worker, $timeout = 90) {
    $now = time();
    foreach ($worker->connections as $connection) {
        // 必须先检查连接状态,再读时间戳
        if (!$connection->isConnected()) {
            continue;
        }
        $last = $connection->lastMessageTime ?? $now;
        if ($now - $last > $timeout) {
            $connection->close();
        }
    }
});

心跳超时阈值不能硬编码为60秒

60秒是Nginx默认proxy_read_timeout

星流
星流

星流是一款面向中文创作者的 AI 绘画、图片生成和视觉设计平台。

下载
,但运营商NAT网关常见超时是30–45秒,AWS ALB固定60秒不可调,Android后台休眠后Socket回收可能短至20秒。服务端设60秒等于主动放弃兼容性。

实际应按最短链路环节定阈值:

  • 纯内网部署:设75秒(留15秒缓冲)
  • 经Nginx+公网:设45秒(严守NAT最短超时)
  • IoT模组直连:查模组AT固件文档,常见为90秒,对应服务端设150秒

客户端心跳间隔要严格小于服务端阈值,建议按阈值 × 0.5设置,比如服务端用45秒,客户端ping就设25秒。

close()前别漏掉资源清理逻辑

单纯调$connection->close()只断TCP,但若该连接绑定了UID或关联了Redis订阅、数据库句柄、临时文件等,这些资源不会自动释放,容易引发内存泄漏或句柄耗尽。

务必在onClose里补全清理,且要和心跳清理路径保持一致:

<pre class="brush:php;toolbar:false;">$worker->onClose = function($connection) {
    // 清理绑定关系
    if (isset($connection->uid)) {
        Gateway::unbindUid($connection->id, $connection->uid);
    }
    // 清理自定义属性(避免下次复用时残留)
    unset($connection->lastMessageTime, $connection->uid, $connection->device_id);
};

注意:如果用了GatewayWorker

onClose里不要手动close(),它会自动处理;纯Worker模式才需要自己关。

真正难的不是写close()这行代码,而是所有路径——onClose、心跳定时器、异常中断捕获——都得统一清理同一套状态,稍有遗漏,假连接就会在$worker->connections里静默堆积,直到Worker::$maxConnection被占满。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

workerman

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Workerman安装配置教程
Workerman安装配置教程

Workerman安装配置教程专题提供Workerman安装配置、WebSocket开发、TCP通信、异步编程、高并发服务搭建与PHP实时通信开发教程。

2026.05.20

126

15

Workerman实时通信与长连接开发教程
Workerman实时通信与长连接开发教程

WWorkerman实时通信与长连接开发教程聚合实时通信、聊天室、长连接、消息推送、AI流式输出等Workerman高并发开发内容。

2026.05.20

162

12

Workerman异步通信与TCP服务器开发
Workerman异步通信与TCP服务器开发

Workerman异步通信与TCP服务器开发专题整理Workerman异步通信、TCP服务、HTTP服务、WebSocket开发与高并发PHP服务器教程。

2026.05.20

127

13

AI视频生成软件推荐
AI视频生成软件推荐

本专题汇总了当前主流的AI视频生成软件推荐与排行榜单,涵盖seko、AniShort、剧云、Lovart、LiblibAI及立刻mv等热门工具。同时整理了各软件在文生视频、图生视频、时长限制、画质表现及免费额度等方面的差异对比,助您快速选对适合创作需求的AI视频生成工具。

2026.09.16

140

9

ai生成视频的工具免费版合集
ai生成视频的工具免费版合集

本专题汇总了当前免费AI生成视频工具的排行榜与推荐清单,涵盖seko、讯飞智作、AniShort及剧云、Lovart等多模型集成平台。同时整理了各工具的免费额度、输出时长、水印政策及适用场景差异,助您快速选择合适工具开启AI视频创作。

2026.09.16

60

10

Pandas时间序列分析与可视化报表
Pandas时间序列分析与可视化报表

本专题整理Pandas日期转换、时间索引、重采样、滚动窗口、时区处理、plot绘图、Styler表格样式和报表输出方法。

2026.09.16

60

23

Pandas数据筛选索引与清洗处理
Pandas数据筛选索引与清洗处理

本专题整理Pandas中的loc、iloc、条件筛选、query查询、缺失值处理、重复值删除、类型转换和字符串列清洗方法。

2026.09.16

40

25

Pandas数据读取导入与文件导出处理
Pandas数据读取导入与文件导出处理

本专题整理Pandas读取CSV、Excel、JSON、SQL、Parquet等文件的方法,以及to_csv、to_excel、to_sql和to_parquet等常用数据导出流程。

2026.09.16

40

27

GDB怎么设置断点
GDB怎么设置断点

本专题介绍GDB按照函数名、源代码行号和文件位置设置断点的方法,详细说明run、continue、next、step等命令的配合使用,帮助定位程序崩溃、逻辑异常及代码未按预期执行的问题。

2026.09.11

360

28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Webman中文手册
Webman中文手册

共0课时 | 0人学习

Workerman官方手册
Workerman官方手册

共0课时 | 0人学习

ThinkPHP5.1完全开发手册
ThinkPHP5.1完全开发手册

共0课时 | 0人学习