讲师中心 微信公众号
AI工具推荐 视频效率加速

Workerman怎么用MySQL_在回调里连接数据库注意事项【指南】

酷辰酱_9963

酷辰酱_9963

发布时间:2026-03-13 22:51:18

|

451人浏览过

|

来源于php中文网

原创

Workerman 中必须复用数据库连接而非每次回调 new PDO,应在 Worker::onWorkerStart 初始化并用 ping 检测重连;禁用持久连接,避免跨回调事务和复用 prepare,不适用协程式异步查库。

workerman怎么用mysql_在回调里连接数据库注意事项【指南】

Workerman 回调里直接 new PDO 会出问题

Workerman 是常驻内存的进程,每个连接回调都在同一个 PHP 进程里反复执行。如果每次回调都 new PDO,不显式关闭,连接数会持续累积,很快打满 MySQL 的 max_connections,然后报错 SQLSTATE[HY000] [1040] Too many connections。

这不是“连不上”,而是“连太多没释放”。常见于用 onMessage 处理请求时随手 new 一个 PDO 实例就查库的写法。

  • 必须复用连接:PDO 实例应作为全局或 Worker 实例属性,在 Worker::onWorkerStart 中初始化,而非在 onMessage / onConnect 中创建
  • 避免使用 PDO::ATTR_PERSISTENT => true:持久连接在 Workerman 下反而加剧连接泄漏,PHP-FPM 的生命周期模型和 Workerman 完全不同
  • 注意连接失效:MySQL 默认 wait_timeout=28800(8 小时),但长连接空闲超时后,下次 query 会抛 MySQL server has gone away,需加简单重连逻辑

用 PDO 做连接池太重,推荐 mysqli + 长连接复用

Workerman 场景下,不需要完整连接池(如 Swoole 的 Coroutine\MySQL),但需要轻量、可控的复用。mysqli 比 PDO 更容易控制底层 socket 生命周期,且原生支持 MYSQLI_OPT_CONNECT_TIMEOUT 等关键选项。

实操建议:

  • 在 Worker::onWorkerStart 中创建 $this->db = new mysqli(...),并设置 $this->db->options(MYSQLI_OPT_CONNECT_TIMEOUT, 3)
  • 每次查询前用 $this->db->ping() 检测连接是否存活,失败则重新 new 一次覆盖旧实例
  • 不要在回调里调 $mysqli->close():关了就真没了,下次还得重连,违背复用初衷
  • 避免在 onClose 或 onWorkerStop 中 close:Workerman 进程退出时 PHP 自动释放资源,手动 close 反而可能触发 warning

事务和 prepare 在 onMessage 里要格外小心

Workerman 的回调是并发执行的,但单个 Worker 进程是同步阻塞模型——这意味着如果你在 onMessage 里开启事务却不提交或回滚,后续同一进程里的其他请求会卡在 START TRANSACTION 后面,直到超时或进程重启。

典型错误现象:Lock wait timeout exceeded; try restarting transaction 或大量请求延迟突增。

  • 事务必须成对出现:有 begin_transaction() 就必须有 commit() 或 rollback(),且不能跨回调边界(比如 begin 在 onMessage,commit 在另一个 onMessage)
  • prepare 语句不能复用跨请求:$stmt = $mysqli->prepare(...) 创建的 stmt 对象绑定的是当前连接上下文,不能存为属性反复 execute;每次都要 prepare → bind → execute → close(stmt close 不影响连接)
  • 如果确实需要预编译优化,改用 mysqli_query("INSERT INTO t VALUES (?, ?)", [$a, $b]) 这类模拟 prepare 的方式(依赖 mysqlnd),更安全

协程风格写法在 Workerman 里不成立

看到 Swoole 或 Hyperf 里用 go(function () { db()->query(...) }),就以为 Workerman 也能“异步查库”——这是根本性误解。Workerman 没有协程调度器,mysqli_query 或 PDO::query 全是同步阻塞调用,哪怕你用 pcntl_fork 或 curl_multi 手动模拟,也只会让问题更难排查。

真正能做的只有两件事:

  • 把耗时 DB 操作控制在 100ms 内:靠索引、精简字段、避免 JOIN、用缓存兜底
  • 把 DB 密集型业务拆出去:用 Redis 队列 + 单独的 CLI 脚本消费,Workerman 只负责收发消息和轻量校验
  • 别碰 stream_select + mysql_real_connect 手写异步 MySQL:workerman/mysql 已废弃,且 TCP 层状态极难维护,线上踩坑成本远高于收益

连接复用这件事,看着简单,实际要同时盯住进程模型、MySQL 状态变量、PHP 扩展行为三块。漏掉 ping、忘了重连、误关连接、跨回调开事务——任一环节松动,都会在高并发下突然崩掉。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

相关专题

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

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

146

2026.05.20

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

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

182

2026.05.20

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

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

167

2026.05.20

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

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

120

2026.09.23

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

60

2026.09.23

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

40

2026.09.23

Conan创建软件包配方指南
Conan创建软件包配方指南

本专题介绍通过conanfile.py创建软件包的方法,讲解包名、版本、依赖和构建设置等基础信息,以及source、build、package、package_info等常用方法的作用及编写思路。

40

2026.09.22

Conan二进制包配置指南
Conan二进制包配置指南

本专题介绍Conan根据操作系统、编译器、架构和构建类型生成二进制包的方法,讲解Profile、Settings、Options及Package ID的作用,帮助管理不同平台和编译环境下的包版本。

40

2026.09.22

Conan私有仓库搭建教程
Conan私有仓库搭建教程

本专题系统的讲解Conan私有仓库的搭建流程,涵盖仓库服务部署、存储目录配置、用户认证、权限划分和远程地址添加,并介绍内部C++依赖包的上传、下载及版本维护方法。

40

2026.09.22

热门下载

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

精品课程

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

共0课时 | 0人学习

Workerman官方手册
Workerman官方手册

共0课时 | 0人学习

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

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn