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

ThinkPHP定时任务是怎样实现的?

接到一个需求:定时检查设备信息,2分钟没有心跳的机器,推送消息给相关人员,用thinkphp5框架,利用框架自带的任务功能与crontab配合来完成定时任务。

第一步:分析需求

  1. 先写获取设备信息,2分钟之内没有心跳的设备信息数据的功能;
  2. 再写推送消息给相关人员的功能;
  3. 写定时任务,调用推送消息的功能,将设备故障的数据通过飞书推送给相关人员处理;

第二步:开始编写代码

这个需求的难点在于推送消息和利用框架编写定时任务的功能,本文就定时任务的功能进行代码展示。

用的框架是thinkphp5框架,利用框架自带的任务功能与crontab配合来完成定时任务。

1. 在tp框架中编写逻辑代码

  • 创建command模块,定义任务类:在项目application目录下创建command模块文件夹->创建任务类文件,继承
    think\console\Command;
    think\console\Input;
    think\console\Output;
    这三个文件。
  • 编写任务逻辑代码:通过实现configure方法来设置任务的名称和描述,execute方法来实现执行任务的逻辑,可以调用其他的方法来实现具体的任务逻辑,例如:发送通知、处理数据等。
  • 配置命令文件:在项目的application目录下的command.php文件中配置,返回一个数组,包含所有类的命名空间,这样thinkphp就知道可以执行的命令。

下面贴上代码,仅供参考:

<?phpnamespace app\command;
use app\admin\controller\Message;
use think\console\Command;
use think\console\Input;
use think\console\Output;
/*** 定时任务类* Class Task* User:赫陈* Date: 2024-07-02*/
class TaskF extends Command
{// 设置命令名称和描述protected function configure(){$this->setName('sendmessage')->setDescription('设备故障发送消息到飞书群');}// 执行命令的逻辑protected function execute(Input $input, Output $output){// 在这里编写具体的任务逻辑,例如发送消息给用户$output->writeln("开始发送消息...");// 假设有一个方法 sendMessageToUser() 用于发送消息$res = $this->sendMessageToUser();$output->writeln("消息发送结果:".$res["message"]);if($res['status'] != 'no'){$output->writeln("消息发送完成!");}}private function sendMessageToUser(){// 实现发送消息的具体逻辑,例如调用API或数据库操作等$Message = new Message();$res = $Message -> sendMessage();return $res;}}

2. 测试代码

逻辑代码编写完后,打开终端,输入thinkphp的命令开始测试

命令:php think sendmessage

回车执行命令

第三步:配置crontab

1. 打开终端,输入crontab -e 命令,编写crontab文件

输入如下命令:

*/5 * * * * /usr/php/bin/php /home/www/project/think sendtofeishu >>  /home/wwwroot/tuoluo/runtime/log/task.log 2>&1

解释:

命令*号的部分为分、时、日、月、周,把想要执行的时间写上,这个是每5分钟执行一次;

/usr/php/bin/php 这部分是php的安装路径,必须得写这个,要不然系统找不到可执行的系统;

/home/www/project/think sendtofeishu 这部分是项目的根目录路径,必须写全了,这样系统才能找到应用;

/home/wwwroot/project/runtime/log/task.log 这部分是执行任务产生的日志文件路径,文件若是没有会自动创建。

2. 保存并退出,用crontab -l 命令查看crontab命令。

第四步:查看执行日志

查看文件中配置的日志文件:用cat 文件名 或者tail -f 命令查看都行。

相关文章:

ThinkPHP定时任务是怎样实现的?

接到一个需求&#xff1a;定时检查设备信息&#xff0c;2分钟没有心跳的机器&#xff0c;推送消息给相关人员&#xff0c;用thinkphp5框架&#xff0c;利用框架自带的任务功能与crontab配合来完成定时任务。 第一步&#xff1a;分析需求 先写获取设备信息&#xff0c;2分钟之…...

[C++][CMake][生成可执行文件][上]详细讲解

目录 0.准备工作1.添加CMakeLists.txt文件2.执行cmake命令3.变量定义4.指定使用的C标准5.指定输出路径 0.准备工作 add.c#include <stdio.h> #include "head.h"int add(int a, int b) {return ab; }sub.c#include <stdio.h> #include "head.h"…...

Asp.net Core 反射加载dll

定义一个类库&#xff0c;定义接口 namespace Plugin {public interface IPlugin{void EllisTest();} }定义另外一个类库&#xff0c;引用上面的类库&#xff0c;实现接口 using Plugin;namespace UserCustom {public class Custom : IPlugin{public void EllisTest(){Conso…...

利用coredump获取程序调用通路

一些前置知识 原文链接&#xff1a;https://blog.csdn.net/tenfyguo/article/details/8159176 一、什么是coredump 我们经常听到大家说到程序core掉了&#xff0c;需要定位解决&#xff0c;这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止&a…...

DVWA sql手注学习(巨详细不含sqlmap)

这篇文章主要记录学习sql注入的过程中遇到的问题已经一点学习感悟&#xff0c;过程图片会比较多&#xff0c;比较基础和详细&#xff0c;不存在看不懂哪一步的过程 文章目录 靶场介绍SQL注入 lowSQL注入 MediumSQL注入 HighSQL注入 Impossible 靶场介绍 DVWA&#xff08;Damn…...

代码随想录算法训练营第70天图论9[1]

代码随想录算法训练营第70天:图论9 ‍ 拓扑排序精讲 卡码网&#xff1a;117. 软件构建(opens new window) 题目描述&#xff1a; 某个大型软件项目的构建系统拥有 N 个文件&#xff0c;文件编号从 0 到 N - 1&#xff0c;在这些文件中&#xff0c;某些文件依赖于其他文件的…...

浏览器设计为默认

...

windows USB 设备驱动开发-USB设备描述符

USB的描述符是USB设备向主机报告状态的重要数据结构&#xff0c;在USB通电后&#xff0c;端点(也称为终结点)0始终处于可用状态&#xff0c;这个默认的端点就是用于主机从设备中读取描述符的。 讨论USB通讯&#xff0c;需要从软件和硬件两方面说起&#xff0c;在软件上&#x…...

【踩坑】修复报错Cannot find DGL libdgl_sparse_pytorch_2.2.0.so

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 错误复现 原因分析 解决方法 错误复现 import dgldataset dgl.data.CoraGraphDataset() graph dataset[0] graph.adjacency_matrix() 原因分…...

postman中参数和x-www-form-urlencoded传值的区别

在 Postman 中&#xff0c;传递参数的方式有多种&#xff0c;其中常用的包括 params 和 x-www-form-urlencoded。这两种方式在使用场景和传递数据的方式上有所不同。 1. Params Params 选项用于在 URL 中传递查询参数。这些参数通常用于 GET 请求&#xff0c;但也可以与其他 …...

自己训练 PaddleOCR

打标工具 https://github.com/Evezerest/PPOCRLabel 感谢这位热心网友提供的标注工具&#xff0c;操作非常的方便 只是这个工具有个小坑get_rotate_crop_image&#xff08;&#xff09; 我的标注数据导出时&#xff0c;很多数据变成倒的 hmmmm, 你管我~ if dst_img_height …...

基于SpringBoot的地方废物回收机构管理系统

本系统主要包括管理员和员工两个角色组成&#xff1b;主要包括&#xff1a;首页、个人中心、员工管理、员工请假管理、销假申请管理、工作日志管理、员工工资管理、员工任务管理、任务汇报管理、设备信息管理、设备借用管理、设备归还管理、设备保修管理、维修入库管理、员工打…...

跑腿平台小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;基础数据管理&#xff0c;管理员管理&#xff0c;接单详情管理&#xff0c;跑腿员管理&#xff0c;跑腿任务管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;跑腿任务&#xff0c;接单员&…...

Java技术栈总结:Redis篇

一、数据类型 Redis 自身是一个 Map&#xff0c;其中的所有数据均采用“key:value”的形式存储。 数据类型指的是存储的数据的类型&#xff0c;即 value 部分的类型&#xff0c;key 的部分只能是字符串。 value 部分的数据类型&#xff1a;<String、List、Hash、Set、Zse…...

django models对应的mysql类型

Django模型字段类型与MySQL数据库类型的对应关系如下&#xff1a; Django 模型字段类型MySQL 数据库类型AutoFieldBIGINT UNSIGNEDCharFieldVARCHARIntegerFieldINTDecimalFieldDECIMALDateFieldDATEDateTimeFieldDATETIMEFileField, ImageFieldVARCHAR (用于文件路径)Boolean…...

2024攻防演练:亚信安全新一代WAF,关键时刻守护先锋

实网攻防 网络安全如同一面坚固的盾牌&#xff0c;保护着我们的信息资产免受无孔不入的威胁。而其中&#xff0c;WAF就像网络安全的守门员&#xff0c;关键时刻挺身而出&#xff0c;为您的企业筑起一道坚实的防线。 攻防不对等 防守方实时应答压力山大 在攻防对抗中&#xf…...

富格林:曝光有效方案安全交易

富格林认为&#xff0c;近些年来大家的投资理财意识逐渐增强&#xff0c;现货黄金作为一种自带优质避险功能的投资产品&#xff0c;自然就受到投资者的关注和追捧。但现货黄金的交易市场相对来说还是比较混杂&#xff0c;投资小白稍不留神就可能会陷入受害陷阱当中无法安全交易…...

ArtTS系统能力-窗口管理的学习(3.2)

上篇回顾&#xff1a; ArtTS系统能力-通知的学习&#xff08;3.1&#xff09; 本篇内容&#xff1a; ArtTS系统能力-窗口管理的学习&#xff08;3.2&#xff09; 一、 知识储备 1. 基本概念 窗口渲染式能力&#xff1a;指对状态栏、导航栏等系统窗口进行控制&#xff0c;减…...

C++ 运算符的优先级和关联性表

C 运算符的优先级和关联性表 1. Precedence and associativity (优先级和结合性)2. Alternative spellings (替代拼写)3. C operator precedence and associativity table (C 运算符的优先级和关联性表)References C documentation (C 文档) https://learn.microsoft.com/en-us…...

正则表达式替换字符串的方法

正则表达式替换字符串的方法 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨一个非常实用的编程技术&#xff1a;使用正则表达式替换字符串。正则…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

xmind转换为markdown

文章目录 解锁思维导图新姿势&#xff1a;将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件&#xff08;ZIP处理&#xff09;2.解析JSON数据结构3&#xff1a;递归转换树形结构4&#xff1a;Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...