Workerman怎么定时清理无效的数据库死连接?

落辰同学_6584

落辰同学_6584

2026-05-24

259人浏览

原创

workerman需惰性检测+按需重建数据库连接:在onworkerstart初始化单连接,执行sql时捕获2006/2013等错误码并重连一次,配合数据库wait_timeout设为60–300秒确保及时清理空闲连接。

workerman怎么定时清理无效的数据库死连接?

Workerman 本身不提供数据库连接池,也不自动管理数据库连接的“有效性”,所谓“死连接”通常指 MySQL/Oracle 等数据库侧因网络中断、服务重启、超时断开后,Workerman 进程里还保留着一个已失效的 PDO 或 mysqli 句柄——后续调用 query() 会直接报错(如 MySQL server has gone away),但连接对象本身不抛异常,也不会自动重连。 解决思路不是靠“定时轮询清理”,而是**惰性检测 + 按需重建**。这是最轻量、最符合 Workerman 进程模型的做法。

为什么不用定时器主动 ping 所有数据库连接?

每个 Worker 进程只持有一个数据库连接(推荐做法),不存在“多个连接要轮询”的场景;定时 PING 会增加无谓 I/O,且无法覆盖真实 SQL 执行时的断连情况(比如中间网络闪断发生在两次 ping 之间);更关键的是,mysqli 或 PDO 的 ping() 方法在部分 PHP 版本或配置下不可靠(例如 MySQLi 的 ping() 在连接已关闭时可能不返回 false,反而触发 warning)。

onWorkerStart 中初始化连接并启用 auto-reconnect

在 onWorkerStart 回调里建立连接,并显式开启驱动层的自动重连能力:

魔搭GPT(ModelScopeGPT)
魔搭GPT(ModelScopeGPT)

魔搭GPT(ModelScopeGPT)是一款AI视频创作工具,阿里达摩院推出的大小模型协同的智能助手,具备作诗、绘画、视频生成、语音播放等多模态能力。

下载
  • PDO:设置 PDO::ATTR_EMULATE_PREPARES => false 和 PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4",但注意 PDO::ATTR_ERRMODE 必须设为 PDO::ERRMODE_EXCEPTION,否则错误不会抛出
  • MySQLi:调用 $mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 3) 并确保 mysqli.reconnect = On 在 php.ini 中启用(PHP 7.0+ 默认开启)
  • 不要把连接存在 static 或全局变量里跨进程共享,每个 Worker 自己管自己的连接

执行 SQL 时捕获死连接错误并重试

真正可靠的检测时机是执行 SQL 的瞬间。遇到典型死连接错误码,就销毁旧连接、重建新连接、重试一次:

  • MySQL 常见错误码:2006(MySQL server has gone away)、2013(Lost connection to MySQL server during query)
  • 在封装的数据库操作方法中(如 db_query()),用 try-catch 包裹 execute() 或 query()
  • 捕获到上述错误码后:unset($this->pdo) 或 $mysqli->close(),再调用初始化逻辑重建连接,然后重试原 SQL
  • 最多重试 1 次,避免无限循环;重试前可加 usleep(10000) 避免雪崩

配合数据库端 idle_timeout 限制更稳妥

光靠应用层不够,必须让数据库主动切断空闲太久的连接,防止连接堆积:

  • MySQL:设置 wait_timeout 和 interactive_timeout(建议 60–300 秒),通过 SHOW VARIABLES LIKE '%timeout%' 查看
  • Oracle:用 PROFILE 设置 IDLE_TIME,如 create profile killidle limit idle_time 30;,再绑定到应用用户
  • PostgreSQL:调整 tcp_keepalives_idle、tcp_keepalives_interval 等参数,或依赖 OS 层 keepalive
  • 这些设置能让数据库在连接空闲超时后主动 KILL,此时下一次应用层 SQL 执行必然失败,从而触发上面的重连逻辑
真正的难点不在代码怎么写,而在于**错误码判断是否完整**、**重连是否线程/进程安全**(Workerman 是多进程,每个进程独立重连没问题)、以及**数据库端 timeout 与应用层重试间隔是否形成安全覆盖**。漏掉一个错误码,或者数据库没配 timeout,死连接就会悄悄积累。

相关专题

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

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

2026.05.20

166

15

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

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

2026.05.20

202

12

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

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

2026.05.20

187

13

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

20

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

40

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

20

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

20

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

20

15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

240

15

热门下载

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

精品课程

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

共0课时 | 0人学习

Workerman官方手册
Workerman官方手册

共0课时 | 0人学习

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

共0课时 | 0人学习