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 中,随后可在消息队列命令窗口中看到该队列被消费提示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/156848.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Spring Boot】如何在Linux系统中快速启动Spring Boot的jar包

在Linux系统中先安装java的JDK 然后编写下列service.sh脚本&#xff0c;并根据自己的需求只需要修改export的log_path、exec_cmd参数即可 # 配置运行日志输出的路径 export log_path/usr/local/project/study-pro/logs # 当前服务运行的脚本命令 export exec_cmd"nohup /u…

算法训练营一刷 总结篇

今天就是Day60了&#xff0c;坚持了两个月的算法训练营在今天结束了。这两个月中&#xff0c;学习、练习了许许多多的算法&#xff0c;坚持每天完成博客来打卡&#xff0c;养成了写C的习惯&#xff0c;现在相比于Python我反而更喜欢思路严谨的C。感谢这个平台&#xff0c;感谢C…

【DevOps】Git 图文详解(七):标签管理

Git 图文详解&#xff08;七&#xff09;&#xff1a;标签管理 标签&#xff08;Tags&#xff09;指的是某个分支某个特定时间点的状态&#xff0c;是对某一个提交记录的 固定 “指针” 引用。一经创建&#xff0c;不可移动&#xff0c;存储在工作区根目录下 .git\refs\tags。可…

Ajax相关知识

目录 一.前后端传输数据的编码格式&#xff08;contentType&#xff09; 1.form表单 2.编码格式 3.Ajax 4.代码演示 后端 前端HTML 二.Ajax发送JSON格式数据 1.引入 后端 前端 2.后端 接收到的数据为空 解决办法 3.request方法判断Ajax 4.总结 前端在通过ajax…

【网络通信】浅析UDP与TCP协议的奥秘

在现代互联网中&#xff0c;UDP&#xff08;用户数据报协议&#xff09;和TCP&#xff08;传输控制协议&#xff09;是两种最常用的传输协议&#xff0c;它们被广泛应用于网络数据传输。尽管这两种协议都可以用来在网络上传输数据&#xff0c;但它们在设计目标、特点和适用场景…

如何用 GPTs 帮你写科研项目申请书?

&#xff08;注&#xff1a;本文为小报童精选文章&#xff0c;已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费&#xff09; 需求 学生们往往会觉得&#xff0c;写开题报告是个苦差事。但他们或许不知道&#xff0c;老师们写起科研项目申请书&#xff0c;压力远比他们…

如何将Docker的构建时间减少40%

与许多公司类似&#xff0c;我们为产品中使用的所有组件构建docker映像。随着时间的推移&#xff0c;其中一些映像变得越来越大&#xff0c;我们的CI构建花费的时间也越来越长。我的目标是CI构建不超过5分钟——差不多是喝杯咖啡休息的理想时间。如果构建花费的时间超过这个时间…

OpenGeometry 开源社区特聘子虔科技云CAD专家 共建云几何内核

11月5日&#xff0c;由广东省工业和信息化厅、广东省科学技术厅、广东省教育厅、深圳市人民政府主办的2023工业软件生态大会在广东省深圳市召开。 开幕式上&#xff0c;备受关注的云几何内核开源平台——OpenGeometry开源社区正式发布。这意味着在几何引擎领域将通过开源这个模…

设计模式—命令模式

1.什么是命令模式&#xff1f; 命令模式是一种行为型设计模式&#xff0c;核心是将每种请求或操作封装为一个独立的对象&#xff0c;从而可以集中管理这些请求或操作&#xff0c;比如将请求队列化依次执行、或者对操作进行记录和撤销。 命令模式通过将请求的发送者&#xff0…

梨花声音教育,美食视频配音再次挑战味蕾

在为美食视频进行配音时&#xff0c;配音艺术家的目标是通过声音来激活观众的感官&#xff0c;唤起他们对美味佳肴的渴望&#xff0c;同时展现食物的诱人特色和烹饪的艺术性。配音应当能够描绘美食的丰富细节&#xff0c;传达烹饪的趣味性以及食材的高品质。以下是一些为美食视…

KWin、libdrm、DRM从上到下全过程 —— drmModeAddFBxxx(20)

接前一篇文章:KWin、libdrm、DRM从上到下全过程 —— drmModeAddFBxxx(19) 上一回讲解了从drm_mode_addfb2_ioctl()和drm_mode_addfb_ioctl()一步步往前追溯的全过程: drm_mode_addfb2_ioctl() / drm_mode_addfb_ioctl() ---> drm_ioctls[] ---> drm_ioctl()---> …

iOS越狱检测总结

文章目录 前言检测越狱文件私有目录检测检测越狱软件检测系统目录是否变为链接动态库检测环境变量检测系统调用检测指令集调用检测其他方式检测 前言 在之前的文章中&#xff0c;已经带大家一起制作了一个屏蔽越狱检测的Tweak。本文就和大家一起学习整理一下iOS系统中有哪些越…

MATLAB算法实战应用案例精讲-【数模应用】漫谈机器学习(三)

目录 机器学习发展历程 1. 五大流派 2. 演化的阶段 1980 年代 1990 年代到 2000 年

NGINX缓存详解之服务端缓存

服务端缓存 proxy cache属于服务端缓存,主要实现 nginx 服务器对客户端数据请求的快速响应。 nginx 服务器在接收到被代理服务器的响应数据之后,一方面将数据传递给客户端,另一方面根据proxy cache的配置将这些数据缓存到本地硬盘上。 当客户端再次访问相同的数据时,nginx…

计算机杂谈系列精讲100篇-【大模型】漫谈ChatGPT

目录 前言 几个高频面试题目 1. ChatGPT的通用性为何做得如此之好?

【Java系列】SpringBoot 集成MongoDB 详细介绍

目录 写在前面 一、步骤介绍 步骤 1: 添加 MongoDB 依赖 步骤 2: 配置 MongoDB 连接信息 步骤 3: 创建实体类 步骤 4: 创建 Repository 接口 步骤 5: 使用 Repository 进行操作 二、特殊处理 写在前面 在Spring Boot中集成MongoDB的过程相对简单&#xff0c;以下是一个…

架构探索之路-第一站-clickhouse | 京东云技术团队

一、前言 架构, 软件开发中最熟悉不过的名词, 遍布在我们的日常开发工作中, 大到项目整体, 小到功能组件, 想要实现高性能、高扩展、高可用的目标都需要优秀架构理念辅助. 所以本人尝试编写架构系列文章, 去剖析市面上那些经典优秀的开源项目, 学习优秀的架构理念来积累架构设…

在html和css中的引用svg(一)

问题&#xff1a;如何让 DIV 中的svg垂直居中&#xff1f; HTML 代码&#xff1a; <div class"content"><svg ...> ... </svg></div> CSS代码&#xff1a; .content svg { vertical-align: middle;} 实用扩展&#xff1a;如何让 DIV 中…

Spring整合其他组件

外部命名空间标签的执行流程&#xff0c;如下&#xff1a; 将自定义标签的约束与物理约束文件与网络约束名称的约束&#xff0c;以键值对形式存储到一个spring.schemas文件中&#xff0c;该文件存储在类加载路径的META-INF里&#xff0c;Spring会自动加载到 将自定义命名空间的…

极致性能优化之道之消除伪共享

“不积跬步&#xff0c;无以至千里。” 引言 在并发编程中&#xff0c;伪共享&#xff08;False Sharing&#xff09;是一种性能问题&#xff0c;特别是在多核处理器上。这个问题通常出现在多个线程同时修改彼此不同但共享同一缓存行的数据。为了解决伪共享问题&#xff0c;我…