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

Laravel/Lumen 任务调度简易入门说明

前提

Laravel 中任务调度简化了服务器系统中 Cron 的操作,使得 计划任务 的实现更为简便。

这里主要以 Laravel 自带的消息队列进行说明,了解其间运行关系可以让我们更清晰的进行代码实现。

下方代码以 Lumen 9.x 框架进行举例,与 Laravel 应无二致。

中文参考文档:任务调度 - Laravel 9.x

定义任务调度

我们称之为 计划任务周期性任务 均可。因为他的目的即是如此。

首先编辑 App\Console\Kernel 类,默认内容如下:

<?phpnamespace App\Console;use Illuminate\Console\Scheduling\Schedule;
use Laravel\Lumen\Console\Kernel as ConsoleKernel;class Kernel extends ConsoleKernel {/*** The Artisan commands provided by your application.** @var array*/protected $commands = [];/*** Define the application's command schedule.** @param Schedule $schedule** @return void*/protected function schedule(Schedule $schedule): void {// TODO:}
}

例如我们需要在 每周一凌晨时段 执行业务统计任务(假设统计上一周订单量、销售额)

周期定义可参阅:任务调度 - 调度频率选项

schedule 方法中先写上如下代码:

protected function schedule(Schedule $schedule): void {$schedule->job()                // 到达指定周期执行的目标任务,此处我们的目的是生产一条消息队列->withoutOverlapping()      // 避免任务重复->timezone('Asia/Shanghai') // 指定时区->weeklyOn([1], '03:00');   // 定义时间:每周一 03:00 AM 执行。如果周一、周三、周六皆需要运行则可将第一参数修改为 [1, 3, 6]
}

IDE 会对 job 方法报出警告,因为我们还未添加其对应的消息队列

添加消息队列

Laravel/Lumen 框架中支持多种消息队列驱动:sqsdatabaseredisbeanstalkd,我们以 redis 为例。此处假设你已做好 redis 队列相关环境以及配置。

我们在 App\Jobs 中编写一个 WeeklyStatisticsJob 类:

<?phpnamespace App\Jobs;class WeeklyStatisticsJob extends Job {public function __construct() {}/*** Execute the job.** @return void*/public function handle(): void {// TODO:echo "done\n";$this->delete();}
}

如需传递自定义参数至该 Job 类,只需在 __construct 方法中添加形参相应,并传递至成员变量,例如:

<?phpnamespace App\Jobs;class WeeklyStatisticsJob extends Job {private int $supplierId;private string $beginDate;private string $endDate;public function __construct(int $supplier_id, string $begin_date, string $end_date) {$this->supplierId = $supplier_id;$this->beginDate = $begin_date;$this->endDate= $end_date;}
}

TODO: 部分为实际业务代码,例如调用服务类实现统计并存储于数据库中。

应用消息队列

回到 App\Console\Kernel 类,将消息队列类实例化进 job 方法即可:

protected function schedule(Schedule $schedule): void {$schedule->job(new WeeklyStatisticsJob(1, '2023-11-13', '2023-11-19'))->withoutOverlapping()->timezone('Asia/Shanghai')->weeklyOn([1], '03:00');
}

注意,我们为了将其与已有消息队列进行区分,应对其指定单独的队列名称。同样,如果需要单独指定消息队列的连接(使用 databasesqs 等),还需指定连接名。

所以我们应当修改为:

protected function schedule(Schedule $schedule): void {$schedule->job(new WeeklyStatisticsJob(1, '2023-11-13', '2023-11-19'),'weekly_calc_statistics',  // 建议指定队列名称,如未指定,默认为 'default''redis'                    // 默认使用 redis 时,此处可忽略)->withoutOverlapping()->timezone('Asia/Shanghai')->weeklyOn([1], '03:00');
}

至此,我们的周期任务就已编写完成,但对于测试来说,周期过于漫长,我们可以将 每周一凌晨三点 修改为每分钟,或者每 5-10 分钟进行测试。

即,将 weeklyOn([1], '03:00') 修改为 everyMinute()everyFiveMinute() 等方法。

运行测试

我们首先应当运行上方编写的队列监听:weekly_calc_statistics

在项目根目录中执行下方命令:

# 如未指定队列名,可忽略 queue 参数
php artisan queue:work --queue=weekly_calc_statistics

随后在 另一 命令窗口中执行:

php artisan schedule:work

稍等片刻,周期任务将生产一条消息队列放入 redis 中,随后可在消息队列命令窗口中看到该队列被消费提示。

相关文章:

  • Windows系统搭建VisualSVN服务并结合内网穿透实现公网访问
  • 【C++进阶之路】第九篇:特殊类设计
  • STM32 寄存器配置笔记——系统时钟配置 HSE as PLL
  • web:[GXYCTF2019]禁止套娃
  • gwas数据获取如何获取完整的GWAS summary数据(1)------GWAS catalog数据库
  • 【JavaEE初阶】 JavaScript基础语法——贰
  • R语言——taxize(第三部分)
  • Linux 常用命令学习笔记
  • Postgresql常用命令函数
  • 目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】目标视觉检测
  • 二百零七、Flume——Flume实时采集5分钟频率的Kafka数据直接写入ODS层表的HDFS文件路径下
  • 使用 AWS boto3 库从 s3 桶中批量下载数据
  • UE TransformVector 学习笔记
  • Go 语言中的map和内存泄漏
  • 5-什么是猴子补丁,有什么用途?什么是反射,python中如何使用反射?http和https的区别?
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • Apache Pulsar 2.1 重磅发布
  • centos安装java运行环境jdk+tomcat
  • DataBase in Android
  • github从入门到放弃(1)
  • java8-模拟hadoop
  • Javascript基础之Array数组API
  • mysql 5.6 原生Online DDL解析
  • PhantomJS 安装
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • 大型网站性能监测、分析与优化常见问题QA
  • 回顾 Swift 多平台移植进度 #2
  • 目录与文件属性:编写ls
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 网页视频流m3u8/ts视频下载
  • 微信公众号开发小记——5.python微信红包
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 一个JAVA程序员成长之路分享
  • 鱼骨图 - 如何绘制?
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • #Linux(帮助手册)
  • %check_box% in rails :coditions={:has_many , :through}
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (翻译)terry crowley: 写给程序员
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (十六)Flask之蓝图
  • (转)Linq学习笔记
  • (转)shell调试方法
  • (状压dp)uva 10817 Headmaster's Headache
  • .net 7 上传文件踩坑
  • .NET 材料检测系统崩溃分析
  • .Net 代码性能 - (1)
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .Net的DataSet直接与SQL2005交互
  • .NET开发者必备的11款免费工具
  • @RequestBody与@ModelAttribute
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]
  • [AIGC] Nacos:一个简单 yet powerful 的配置中心和服务注册中心