Workerman中怎么处理定时器导致的数据库超时?

碧海醫心

碧海醫心

2026-05-26

808人浏览

原创

这不是数据库配置低,而是多个workerman进程并发update同一行且事务含sleep()等阻塞操作,导致锁长期未释放;根本解法是禁用事务内sleep()、改用timer::add()异步延时,并确保update命中索引。

workerman中怎么处理定时器导致的数据库超时?

定时器执行SQL时卡住,报Lock wait timeout exceeded

这通常不是MySQL配置太低,而是多个Workerman进程(或定时器+Web请求)同时UPDATE同一行,且事务里混了sleep()、远程调用等阻塞操作。InnoDB检测到锁等待超时(默认50秒),就抛出Lock wait timeout exceeded; try restarting transaction。Windows下更明显,因为innodb_lock_wait_timeout没调小,但问题根子不在timeout值——在锁没及时释放。

  • 定时器进程和Web请求是两个独立数据库连接,各自开启事务后,若都对id=1执行UPDATE,又没统一加锁顺序,极易形成循环等待
  • 如果UPDATE的WHERE条件没走索引(比如WHERE status = 'pending'status无索引),InnoDB会升级为表级锁,死锁概率陡增
  • sleep(2)写在事务里是致命错误:Workerman进程被卡住,连接不释放,锁就一直挂着

别在定时器里写sleep(),改用Timer::add()做异步延时

sleep()会让整个Worker进程停摆,后续所有IO、心跳、新连接全卡死。你看到的“卡几十秒”,其实是事务挂起+锁等待+超时三重叠加。

  • 所有延时逻辑必须用Timer::add()注册回调,例如Timer::add(30, [$handler, 'checkOrderTimeout'])
  • 回调函数内不能出现任何同步阻塞调用:file_get_contents()mysqli_query()curl_exec()都得换成异步替代方案
  • 需要链式延时(如“30秒后检查→再过10秒重试”),必须在第一次回调里再次调用Timer::add(),而不是嵌套sleep()
  • 记得保存返回的$timerId,并在业务完成或连接断开时主动Timer::del($timerId),否则内存泄漏+定时器堆积

UPDATE语句必须命中主键或唯一索引,否则锁范围失控

InnoDB行锁生效的前提是WHERE能精准定位单行。如果UPDATE走不了索引,就会锁整张表,让并发更新直接变成排队。

Workerman
Workerman

最新主版本,继续强化高性能异步网络能力,适合 WebSocket、HTTP 服务、长连接、IM、IoT 等场景。 本次版本主要围绕稳定性、协议兼容以及连接处理能力优化,依旧保持超轻量和纯 PHP 特性。 适用于 PHP 8.x 环境,可配合 webman、GatewayWorker 等生态使用。

下载
  • EXPLAIN SELECT * FROM orders WHERE order_no = 'xxx'确认typeconsteq_ref
  • 给业务中高频UPDATE的字段建唯一索引,比如order_nouser_id,才能安全用INSERT ... ON DUPLICATE KEY UPDATE替代“查+判+更”
  • 禁止在事务里SELECT FOR UPDATE后再做耗时计算;真要分步锁,所有路径必须严格按相同顺序访问表(例如永远先锁users再锁orders

多Worker部署时,定时任务重复执行怎么办

Workerman不支持跨进程共享定时器,onWorkerStart里每个Worker都会注册一份,4个Worker就跑4次同一定时任务。

  • 用Redis分布式锁控制入口:SET lock:order_timeout "1" NX EX 30,抢到才执行,失败直接return
  • 或改用延迟消息:把订单ID和超时时间写入Redis ZSET(score=超时时间戳),另起一个常驻Worker轮询ZSET头元素,避免定时器精度误差和重复问题
  • 定时器本身只负责“触发检查”,不负责“执行关单”,真正的DB更新和通知推送应交给Task Worker或独立服务处理

真正容易被忽略的是:没人清理的Timer::add()会在Worker内存里持续累积,跑几天后响应变慢、OOM、日志里却找不到明显线索。

相关文章

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

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

下载

相关标签:

workerman

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

相关专题

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

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

2026.05.20

41

15

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

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

2026.05.20

139

12

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

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

2026.05.20

62

13

Selenium WebDriver元素定位与页面操作教程
Selenium WebDriver元素定位与页面操作教程

本专题整理Selenium WebDriver元素定位、XPath、CSS Selector、等待机制、窗口切换、Frame处理、Alert弹窗、Cookie操作和文件上传等核心用法。

2026.08.05

3

26

Selenium Grid分布式测试与并行执行教程
Selenium Grid分布式测试与并行执行教程

本专题整理Selenium Grid架构、远程WebDriver、并行测试、Docker部署、Kubernetes动态Grid、浏览器矩阵和测试环境扩展方法,适合进阶自动化测试团队使用。

2026.08.05

1

18

Selenium常见报错排查与自动化测试稳定性
Selenium常见报错排查与自动化测试稳定性

本专题整理Selenium常见报错、驱动版本问题、元素找不到、点击失败、等待超时、浏览器闪退、脚本不稳定和测试用例维护方法。

2026.08.05

0

17

墨刀AI提示词教学
墨刀AI提示词教学

本合集由PHP中文网精心整理,为您提供全面的墨刀AI提示词教学。内容涵盖高质量原型撰写公式与实操窍门,助您轻松掌握AI设计工具。无论是零基础入门还是进阶技巧,都能让您快速上手,大幅提升产品设计与协作效率。

2026.08.04

11

21

墨刀AI完整入门
墨刀AI完整入门

PHP中文网为您倾力打造墨刀AI保姆级入门指南完整版!本合集从零基础讲起,涵盖AI生成原型、提示词优化、图片转原型及多轮对话等核心功能。无论您是新手还是进阶用户,都能轻松掌握产品设计全流程。快来PHP中文网,一键解锁高效设计技巧,让想法即刻成型!

2026.08.04

8

20

墨刀AI进阶技巧
墨刀AI进阶技巧

本合集由PHP中文网精心整理,为您提供墨刀AI核心进阶策略指南。内容涵盖高效提示词写作、原型智能生成与微调、结构化导图制作及行业分析报告输出等实战技巧。助您轻松掌握AI设计工具,大幅提升产品设计与团队协作效率。

2026.08.04

10

14

热门下载

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

精品课程

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

共0课时 | 0人学习

Workerman官方手册
Workerman官方手册

共0课时 | 0人学习

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

共0课时 | 0人学习