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

打印 上一主题 下一主题

主题 1813|帖子 1813|积分 5443

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

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

1. Workerman 定时任务基础

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


  • 间隔执行:每隔指定时间执行一次。
  • 延迟执行:延迟指定时间后执行一次。
基本示例

  1. use Workerman\Worker;
  2. use Workerman\Timer;
  3. require_once __DIR__ . '/vendor/autoload.php';
  4. $worker = new Worker();
  5. $worker->onWorkerStart = function ($worker) {
  6.     // 间隔 1 秒执行
  7.     Timer::add(1, function () {
  8.         echo "每秒执行的任务\n";
  9.     });
  10.     // 延迟 5 秒执行(仅一次)
  11.     Timer::add(5, function () {
  12.         echo "延迟 5 秒执行的任务\n";
  13.     }, [], false);
  14. };
  15. Worker::runAll();
复制代码

2. 定时任务设置

参数说明



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

    • $interval: 时间间隔(秒),支持小数(如 0.1 表示 100 毫秒)。
    • $callback: 回调函数或闭包。
    • $args: 通报给回调函数的参数数组。
    • $persistent: 是否恒久化(true 为间隔执行,false 为单次执行)。

制止定时器

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

3. 高级用法

多进程任务控制

默认环境下,每个 Worker 进程都会创建本身的定时器。若需单例任务(仅一个进程执行),需结合进程 ID 判断:
  1. $worker->onWorkerStart = function ($worker) {
  2.     if ($worker->id === 0) { // 仅第一个 Worker 进程执行
  3.         Timer::add(1, function () { /* ... */ });
  4.     }
  5. };
复制代码
Cron 表达式支持

Workerman 本身不支持 Cron,但可结合第三方库(如 mtdowling/cron-expression)实现复杂调理:
  1. use Cron\CronExpression;
  2. $cron = CronExpression::factory('* * * * *');
  3. Timer::add(60, function () use ($cron) {
  4.     if ($cron->isDue()) {
  5.         echo "每分钟执行的任务\n";
  6.     }
  7. });
复制代码

4. 注意事项

内存管理



  • 长时间运行的定时任务需注意内存泄漏,避免在闭包中累积变量。
  • 定期手动调用 gc_collect_cycles() 触发垃圾回收。
异常处理



  • 定时任务中的异常需自行捕获,否则可能导致 Worker 进程崩溃:
  1. Timer::add(1, function () {
  2.     try {
  3.         // 业务逻辑
  4.     } catch (Exception $e) {
  5.         echo "Error: " . $e->getMessage();
  6.     }
  7. });
复制代码

5. 实际应用场景

数据同步

  1. Timer::add(300, function () { // 每 5 分钟同步数据
  2.     $data = fetchExternalData();
  3.     saveToDatabase($data);
  4. });
复制代码
日志清理

  1. Timer::add(86400, function () { // 每天清理日志
  2.     $files = glob('/logs/*.log');
  3.     foreach ($files as $file) {
  4.         if (filemtime($file) < time() - 30 * 86400) {
  5.             unlink($file);
  6.         }
  7.     }
  8. });
复制代码

6. 性能优化



  • 避免阻塞:耗时任务应异步处理(如投递到队列)。
  • 时间精度:高精度定时(如 <1 秒)需考虑系统负载。
  • 分布式扩展:多机部署时,利用 Redis 锁确保任务唯一性。

7. 对比其他方案

方案适用场景特点Workerman Timer单机高频任务、简单调理轻量级、低延迟Crontab系统级定时任务依赖系统环境、分钟级精度Swoole Timer高性能应用、复杂调理支持毫秒级精度、更丰富的 APILaravel SchedulerWeb 应用、结合 Cron 利用需要配合 Cron 触发、功能丰富
通过合理利用 Workerman 的定时任务,可以高效处理配景逻辑,尤其适合需要长毗连或高实时性的场景。对于复杂调理需求,发起结合外部工具(如 Redis 或数据库)实现分布式任务管理。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

刘俊凯

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表