当前位置: 首页 > backend >正文

php 框架Workerman定时任务详解《一》

Workerman 是一个高性能的 PHP Socket 框架,常用于开发实时通信、长连接服务等场景。其定时任务功能基于内置的 Timer 类实现,能够方便地处理周期性或延迟任务。以下是详细解析:


1. Workerman 定时任务基础

Workerman 的定时任务依赖于 Workerman\Timer 类,支持两种模式:

  • 间隔执行:每隔指定时间执行一次。

  • 延迟执行:延迟指定时间后执行一次。

基本示例
use Workerman\Worker;
use Workerman\Timer;require_once __DIR__ . '/vendor/autoload.php';$worker = new Worker();$worker->onWorkerStart = function ($worker) {// 间隔 1 秒执行Timer::add(1, function () {echo "每秒执行的任务\n";});// 延迟 5 秒执行(仅一次)Timer::add(5, function () {echo "延迟 5 秒执行的任务\n";}, [], false);
};Worker::runAll();

2. 定时任务配置

参数说明
  • Timer::add(float $interval, callable $callback, array $args = [], bool $persistent = true)

    • $interval: 时间间隔(秒),支持小数(如 0.1 表示 100 毫秒)。

    • $callback: 回调函数或闭包。

    • $args: 传递给回调函数的参数数组。

    • $persistent: 是否持久化(true 为间隔执行,false 为单次执行)。

停止定时器
$timerId = Timer::add(2, function () { /* ... */ });
// 停止指定定时器
Timer::del($timerId);

3. 高级用法

多进程任务控制

默认情况下,每个 Worker 进程都会创建自己的定时器。若需单例任务(仅一个进程执行),需结合进程 ID 判断:

$worker->onWorkerStart = function ($worker) {if ($worker->id === 0) { // 仅第一个 Worker 进程执行Timer::add(1, function () { /* ... */ });}
};
Cron 表达式支持

Workerman 本身不支持 Cron,但可结合第三方库(如 mtdowling/cron-expression)实现复杂调度:

use Cron\CronExpression;$cron = CronExpression::factory('* * * * *');
Timer::add(60, function () use ($cron) {if ($cron->isDue()) {echo "每分钟执行的任务\n";}
});

4. 注意事项

内存管理
  • 长时间运行的定时任务需注意内存泄漏,避免在闭包中累积变量。

  • 定期手动调用 gc_collect_cycles() 触发垃圾回收。

异常处理
  • 定时任务中的异常需自行捕获,否则可能导致 Worker 进程崩溃:

Timer::add(1, function () {try {// 业务逻辑} catch (Exception $e) {echo "Error: " . $e->getMessage();}
});

5. 实际应用场景

数据同步
Timer::add(300, function () { // 每 5 分钟同步数据$data = fetchExternalData();saveToDatabase($data);
});
日志清理
Timer::add(86400, function () { // 每天清理日志$files = glob('/logs/*.log');foreach ($files as $file) {if (filemtime($file) < time() - 30 * 86400) {unlink($file);}}
});

6. 性能优化

  • 避免阻塞:耗时任务应异步处理(如投递到队列)。

  • 时间精度:高精度定时(如 <1 秒)需考虑系统负载。

  • 分布式扩展:多机部署时,使用 Redis 锁确保任务唯一性。


7. 对比其他方案

方案适用场景特点
Workerman Timer单机高频任务、简单调度轻量级、低延迟
Crontab系统级定时任务依赖系统环境、分钟级精度
Swoole Timer高性能应用、复杂调度支持毫秒级精度、更丰富的 API
Laravel SchedulerWeb 应用、结合 Cron 使用需要配合 Cron 触发、功能丰富

通过合理使用 Workerman 的定时任务,可以高效处理后台逻辑,尤其适合需要长连接或高实时性的场景。对于复杂调度需求,建议结合外部工具(如 Redis 或数据库)实现分布式任务管理。

http://www.xdnf.cn/news/1764.html

相关文章:

  • MCP开发实战(一)基于MCP协议的大模型网关——多个大模型API统一封装为标准化工具
  • Axure大屏可视化模板:多领域数据决策的新引擎
  • TXPOLARITY/RXPOLARITY设置
  • java延迟map, 自定义延迟map, 过期清理map,map能力扩展。如何设置map数据过期,改造map适配数据过期
  • day6-小白学习JAVA---方法_面向对象
  • 了解低功耗蓝牙中的安全密钥
  • 缓存穿透、雪崩、击穿深度解析与解决方案
  • 多线程中的ABA问题详解
  • Java并发编程|CompletableFuture原理与实战:从链式操作到异步编排
  • BGE(BAAI General Embedding)模型详解
  • Nginx 安装与配置全流程指南(2025 最新版)
  • 桌面应用中VUE使用新浏览器窗口打开页面
  • Parasol 将交易卡牌游戏体验带入 Sui
  • Python中的 for 与 迭代器
  • 一种企业信息查询系统设计和实现:xujian.tech/cs
  • 白鲸开源WhaleStudio与崖山数据库管理系统YashanDB完成产品兼容互认证
  • python中socket(套接字)库详细解析
  • 拆解华为Pura X新发现:“仿生”散热与钛合金“骨架”
  • G3学习笔记
  • [C] 第6章 C51函数
  • 音视频之H.265/HEVC量化
  • 项目中数据结构为什么用数组,不用List
  • [Redis] Redis最佳实践
  • 【bmc1】概要,构建image
  • NVIDIA自动驾驶安全与技术读后感
  • 轻松完成视频创作,在线视频编辑器,无需下载软件,功能多样实用!
  • 【国产化之路】VPX-3U :基于D2000 /FT2000的硬件架构到操作系统兼容
  • postgres 导出导入(基于数据库,模式,表)
  • 优先级队列和仿函数的讲解(底层实现)
  • AWS 中国区 CloudFront SSL 证书到期更换实战指南