0

0

Workerman里不能用sleep那怎么延时_Timer::add定时器替代方案【技巧】

看不見的法師

看不見的法師

发布时间:2026-03-16 20:32:03

|

834人浏览过

|

来源于php中文网

原创

Workerman中禁用sleep(),改用Timer::add()实现异步延时;需检查连接状态、绑定上下文、避免内存泄漏,并合理管理定时器生命周期。

workerman里不能用sleep那怎么延时_timer::add定时器替代方案【技巧】

Workerman里用sleep()会导致进程阻塞,必须换掉

Workerman是常驻内存的异步事件驱动框架,所有逻辑跑在单线程(或多个worker进程)的事件循环里。sleep()这种同步阻塞调用会卡住整个进程,后续所有连接、定时器、IO都停摆——不是“延时”,是“瘫痪”。你看到的连接超时、心跳断开、定时器失灵,八成就是偷偷用了sleep()

Timer::add()是最直接的替代方案,但要注意回调执行时机

它本质是注册一个异步回调,在指定毫秒后由事件循环触发。和sleep()的“暂停当前流程”完全不同,它是“预定一个将来要做的事”。

  • 回调函数里不能写阻塞操作(比如file_get_contents()mysqli_query()),否则照样卡死
  • 如果需要链式延时(比如延时1秒→再延时2秒→再执行),得在第一次回调里再调一次Timer::add(),不能靠嵌套sleep()模拟
  • 定时器默认只执行一次;需要重复执行,得传true作为第四个参数:Timer::add(1000, [$obj, 'method'], [], true)
  • 记得在不需要时手动清除:Timer::del($timerId),否则内存泄漏+定时器堆积

延时发消息/重试场景下,别把Timer::add()写在onMessage里就完事

常见错误:客户端发来指令,你想“5秒后推送结果”,于是在onMessage里直接Timer::add(5000, function() { ... })——问题在于:这个回调执行时,原始的$connection可能已经断开、被回收,甚至$this指向已失效。

叮当好记-AI音视频转图文
叮当好记-AI音视频转图文

AI音视频转录与总结,内容学习效率 x10!

下载
  • 务必在回调里先检查连接状态:if ($connection->isConnected()) { $connection->send(...); }
  • 如果要绑定上下文(比如用户ID、任务ID),用闭包use传值,别依赖外部变量引用:Timer::add(5000, function() use ($uid, $connection) { ... })
  • 高频触发场景(如每秒上百次延时任务),避免无节制创建定时器,考虑用队列+单个长周期定时器轮询

复杂延时逻辑建议封装成独立类,别堆在Worker里

比如“下单后30分钟未支付自动关单”,涉及时间计算、状态检查、DB更新、通知推送——全塞进Timer::add()回调里,可读性差、难测试、没法复用。

  • 抽成OrderTimeoutHandler类,构造时传入订单ID和Worker实例
  • __invoke()handle()里做完整业务逻辑,包括异常捕获和重试策略
  • 延时触发时,new一个实例并调用方法,比裸写匿名函数更可控
  • 注意:Workerman不支持跨进程共享定时器,多worker时需配合Redis锁或延迟队列防重复执行

真正容易被忽略的是定时器的生命周期管理——没人清理的Timer::add()就像没关的数据库连接,跑几天后worker内存暴涨、响应变慢,错误日志里却找不到明显报错。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

847

2023.08.22

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

448

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

606

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

786

2023.08.10

go语言闭包相关教程大全
go语言闭包相关教程大全

本专题整合了go语言闭包相关数据,阅读专题下面的文章了解更多相关内容。

153

2025.07.29

function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

500

2023.08.04

js函数function用法
js函数function用法

js函数function用法有:1、声明函数;2、调用函数;3、函数参数;4、函数返回值;5、匿名函数;6、函数作为参数;7、函数作用域;8、递归函数。本专题提供js函数function用法的相关文章内容,大家可以免费阅读。

167

2023.10.07

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1007

2023.11.02

chatgpt使用指南
chatgpt使用指南

本专题整合了chatgpt使用教程、新手使用说明等等相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.16

热门下载

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

精品课程

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

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