Linux下ThinkPHP5实现定时器任务 - 结合crontab

实例一:

1.在/application/command创建要配置的PHP类文件,需要继承Command类,并重写configure和execute两个方法,例如:

<?php
namespace app\command;
use think\console\Command;
use think\console\Input;
use think\console\Output;
use think\Db;
class Test extends Command
{// 配置定时器的信息protected function configure(){$this->setName('test')->setDescription('Command Test');}protected function execute(Input $input, Output $output){// 输出到日志文件$output->writeln("TestCommand:");// 定时器需要执行的内容// .....$output->writeln("end....");}
}

2.修改application/command.php内容,加入上述的定时器内容

<?php
return ['application\command\Test', // 加入需要cmd运行的PHP文件
];

3.添加shell执行文件

在项目根目录下创建shell脚本,例如crond.sh

#!/bin/sh
PATH=/usr/local/php/bin:/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin # 将php路径加入都临时变量中
cd /home/wwwroot/域名/  # 进入项目的根目录下,保证可以运行php think的命令
php think test # 执行在Test.php设定的名称

注意:test 可执行命令是ThinkPHP自带的,可以通过 连接服务器,到/home/wwwroot/域名/ 目录下,输入 php think查询可以被执行的命令,如下:

4.使用crontab设置定时器

有两种方式,效果是一样的:

1.连接到服务器,输入 crontab -e,写入:

0 0 * * * /home/wwwroot/域名/crond.sh

注意:1).0 0 * * * 是crontab的定时表达式,表示每天的0点0分执行该文件,具体详情可以访问《crontab定时写法》进行学习。

         2).可以使用crontab -l 的命令查看已登录的账户有几个定时器。

         3).可以到 /var/log/cron 文件查看日志文件,便于追踪错误。

2.连接到服务器,输入 vim /etc/crontab, 初始化内容为:

在该文件写入

0 0 * * * root /home/wwwroot/域名/crond.sh

最终的查看的结果是:

最后保存该文件

5.重启crond服务

service crond restart

如果 该命令无法重启,请使用systemctl restart crond 进行重启。

发现还有一个方法,需要修改本文的前三步,后面均一致。

1).新增Controller类,并编写相对应的方法,例如:

<?phpnamespace app\demo\controller;use think\Controller;
use think\Log;class Test extends Controller
{public function test(){Log::error('start test  crond demo.....');Log::error('end test  crond demo.....');}}

访问test方法的路由:demo/test/test

2).添加shell执行文件

在项目根目录下创建shell脚本,例如crond.sh

#!/bin/sh

PATH=/usr/local/php/bin:/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# 1.执行 php 命令不需要到thinkphp项目的目录下 2.index.php为入口文件 3.第三个参数为需要执行方法的路由

php /home/wwwroot/域名/index.php demo/test/test

后面的步骤从本文第4步开始,就可以完成定时功能。

个人意见:第二种方法符合API引用的思维,觉得比较容易被接受,第一种有点引用插件的感觉,对于刚接触项目的用户友好一点,可以知道项目的定时器;因此个人觉得这两种都可以,看个人习惯。

实例二:可后台自定义定时任务

PHP函数:https://blog.csdn.net/meimeieee/article/details/79556191

Linux crontab:https://www.cnblogs.com/longjshz/p/5779215.html

第一种:PHP函数

这个可根据业务需求在项目后台做成配置页面,运营人员也可配置。
 

<?php//开始任务public function startCrond($id) {Db::name('crond')->where(['id' => $id])->setField('run', 1);$this->execCrond($id);}//终止任务public function abortCrond($id) {Db::name('crond')->where(['id' => $id])->setField('run', 0);}//执行任务public function execCrond($id) {ignore_user_abort(); //关掉浏览器,PHP脚本也可以继续执行.set_time_limit(0); // 通过set_time_limit(0)可以让程序无限制的执行下去do {$crond_info = Db::name('crond')->where(['id' => $id])->find();if (!$crond_info['run']) {die('process abort'); //终止任务}if (1 == $crond_info['type']) {//每过多少秒执行一次file_get_contents($crond_info['command']);Db::name('crond')->where(['id' => $crond_info['id']])->setInc('exec_count'); //自增累计执行次数sleep($crond_info['interval']); // 间隔} elseif (2 == $crond_info['type']) {//每天只执行一次$newDate = date("H:i"); //获取当前时分,比对if ($crond_info['interval'] == $newDate) {file_get_contents($crond_info['command']);Db::name('crond')->where(['id' => $crond_info['id']])->setInc('exec_count'); //自增累计执行次数sleep(3600 * 24); // 间隔} else {sleep(60); // 间隔}}} while (true);}//任务1public function testCrond1() {Db::name('test')->insert(['crond_id' => '1', 'date' => date('YmdHis')]);}//任务2public function testCrond2() {Db::name('test')->insert(['crond_id' => '2', 'date' => date('YmdHis')]);}//任务3public function testCrond3() {Db::name('test')->insert(['crond_id' => '3', 'date' => date('YmdHis')]);}
CREATE TABLE `bs_crond` (`id` int(11) NOT NULL AUTO_INCREMENT,`type` tinyint(2) NOT NULL DEFAULT '1' COMMENT '1、以秒为周期,2、以天为周期',`interval` varchar(30) DEFAULT NULL COMMENT 'type=1:间隔秒数,type=2:每天的执行时间时分 示例12:10',`command` varchar(100) NOT NULL COMMENT '任务',`path` varchar(100) DEFAULT NULL,`exec_count` int(11) DEFAULT '0' COMMENT '累计执行统计',`run` varchar(10) DEFAULT '0' COMMENT '是否开始 1、正常执行,0、终止',PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=191 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='周期任务';CREATE TABLE `test` (`id` int(11) NOT NULL AUTO_INCREMENT,`crond_id` int(11) DEFAULT NULL,`date` datetime DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=352 DEFAULT CHARSET=utf8mb4 COMMENT='测试表';

执行结果:

第二种:Linux 服务器上使用 CronTab

crontab的基本格式:

f1 f2 f3 f4 f5 command

分 时     日 月 周 命令

第一列f1代表分钟1~59:当f1为*表示每分钟都要执行;为*/n表示每n分钟执行一次;为a-b表示从第a分钟到第b分钟这段时间要执行;为a,b,c,...表示第a,b,c分钟要执行

第二列f2代表小时0~23(0表示凌晨):当f2为*表示每小时都要执行;为*/n表示每n小数执行一次;为a-b表示从第a小时到第b小时这段时间要执行;为a,b,c,...表示第a,b,c小时要执行

第三列f3代表日1~31:含义如上所示,以此类推

第四列f4代表月1~12:含义如上所示,以此类推

第五列f5代表星期0~6(0表示星期天):含义如上所示,以此类推

第六列command代表要运行的命令

命令参数:

crontab    -l   在标准输出上显示当前的crontab
crontab    -r   删除当前的crontab文件
crontab    -e  编辑当前的crontab文件

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

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

相关文章

“降本”是关键,FCU1104打造低成本工商业储能EMS

在不久前举行的EESA中国国际储能展上&#xff0c;“工商业储能”成为了热度最高的话题之一&#xff0c;几乎每家展出工商业储能系统的展商都收获了大量观众的驻足围观&#xff0c;热度非凡。究竟是怎样的原因让工商业储能如此瞩目呢&#xff1f; 通过与多家储能厂家沟通并查阅…

【音视频】ffplay源码解析-PacketQueue队列

包队列架构位置 对应结构体源码 MyAVPacketList typedef struct MyAVPacketList {AVPacket pkt; //解封装后的数据struct MyAVPacketList *next; //下一个节点int serial; //播放序列 } MyAVPacketList;PacketQueue typedef struct PacketQueue {MyAVPacketList …

论文精读(2)—基于稀疏奖励强化学习的机械臂运动规划算法设计与实现(内含实现机器人控制的方法)

目录 1.作者提出的问题及解决方向 2.延深-用如何用强化学习对机器人进行控制 2.1思路 2.2DQN和DDPG在机器人控制中的应用 3.解决方案 3.1思路 3.2实验 3.3创新点 4.展望 1.作者提出的问题及解决方向 目的&#xff1a;使机械臂在非结构化环境下实现端到端的自主学习控制…

MySQL学习笔记6

MySQL数据库如何存放数据&#xff1f; 注明&#xff1a;我们平常说的MySQL&#xff0c;其实主要指的是MySQL数据库管理软件。 一个MySQL DBMS可以 同时存放多个数据库&#xff0c;理论上一个项目就对应一个数据库。 如博客项目blog数据库&#xff0c;商城项目shop数据库&#…

(Vue2)智慧商城项目

新增两个目录api、utils api接口模块&#xff1a;发送ajax请求的接口模块 utils工具模块&#xff1a;自己封装的一些工具方法模块 第三方组件库vant-ui PC端&#xff1a;element-ui&#xff08;element-plus&#xff09; ant-design-vue 移动端&#xff1a;vant-ui Mint UI…

【计算机网络 - 自顶向下方法】计算机网络和因特网

目录 1. What is the Internet? 1.1 因特网的具体构成 1.2 因特网的功能 2. Network core 2.1 基本介绍 2.2 分组交换 2.2.1 序列化时延 2.2.2 排队延迟和丢包 2.2.3 分组交换的优缺点 2.3 电路交换 2.3.1 基本概念 2.3.2 电路交换网络中的复用 2.3.3 电路交换文件…

中秋国庆内卷之我爱学习C++

文章目录 前言Ⅰ. 内联函数0x00 内联函数和宏的比较0x01 内联函数的概念0x02 内联函数的特性 Ⅱ. auto&#xff08;C 11)0x00 auto的概念0x01 auto的用途 Ⅲ. 范围for循环(C11)0x00 基本用法0x01 范围for循环(C11)的使用条件 Ⅳ. 指针空值nullptr(C11)0x00 概念 前言 亲爱的夏…

Lnmp架构之mysql数据库实战2

4、mysql组复制集群 一主多从的请求通常是读的请求高于写 &#xff0c;但是如果写的请求很高&#xff0c;要求每个节点都可以进行读写&#xff0c;这时分布式必须通过&#xff08;多组模式&#xff09;集群的方式进行横向扩容。 组复制对节点的数据一致性要求非常高&#xff…

人工智能驱动的自然语言处理:解锁文本数据的价值

文章目录 什么是自然语言处理&#xff1f;NLP的应用领域1. 情感分析2. 机器翻译3. 智能助手4. 医疗保健5. 舆情分析 使用Python进行NLP避免NLP中的陷阱结论 &#x1f389;欢迎来到AIGC人工智能专栏~人工智能驱动的自然语言处理&#xff1a;解锁文本数据的价值 ☆* o(≧▽≦)o *…

1791_树莓派bash入门杂志_Essentials_Bash_v1

全部学习汇总&#xff1a; GreyZhang/little_bits_of_raspberry_pi: my hacking trip about raspberry pi. (github.com) 拿到一份树莓派早期的宣传电子杂志资料&#xff0c;看了一下感觉还是有一些帮助。针对里面多少有一些共鸣的地方&#xff0c;做一个简单的整理。 1. 命令行…

【kohya】训练自己的LoRA模型

文章目录 序言准备环境准备图片处理图片下载kohya_ss代码修改pyvenv.cfg启动界面访问地址生成字幕准备训练的文件夹配置训练参数开始训练遇到的问题&#xff1a; 序言 在把玩stable diffusion的webUI和comfyUI后&#xff0c;思考着自己也微调一个个性化风格的checkpoint、LyCO…

FPGA的DQPSK调制解调Verilog

名称&#xff1a;DQPSK调制解调 软件&#xff1a;Quartus 语言&#xff1a;Verilog 要求&#xff1a; 使用Verilog语言进行DQPSK调制和解调&#xff0c;并进行仿真 代码下载&#xff1a;DQPSK调制解调verilog&#xff0c;quartus_Verilog/VHDL资源下载 代码网&#xff1a;h…

机试算法学习

又到了一年一度的校招干饭环节&#xff0c;本人不得已以应届生的身份卷入了这场洪流&#xff0c;让我们各自加油吧&#xff01; 蛇形矩阵 xx机考编程题 题目描述 输入两个整数 n和 m&#xff0c;输出一个 n 行 m 列的矩阵&#xff0c;将数字 1到 nm按照回字蛇形填充至矩阵中…

【数据开发】数据全栈知识架构,数据(平台、开发、管理、分析)

文章目录 一、数据全栈知识架构1、数据方法&#xff08;思维&#xff0c;统计学&#xff0c;实践&#xff0c;北极星&#xff09;2、数据工具&#xff1a;数据仓库3、数据规范 二、数据分析工具1、大数据平台2、数据开发&#xff1a;入库计算&#xff08;重点&#xff09;3、数…

AI AIgents时代 - (三.) AutoGPT和AgentGPT

前两篇讲解了Agent的原理和组件&#xff0c;这节我将给大家介绍两个agent项目&#xff0c;给出它们的工作原理和区别&#xff0c;并教大家亲手尝试使用 Agents&#x1f389; &#x1f7e2; AutoGPT&#x1f916;️ 我们的老朋友&#xff0c;之前文章也专门写过。AutoGPT 是一…

MySQL单表查询和多表查询

一、单表查询 素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作等 CREATE TABLE worker (部门号 int(11) NOT NULL,职工号 int(11) NOT NULL,工作时间 date NOT NULL,工资 float(8,2) NOT NULL,政治面貌 varchar(10)…

李宏毅hw-9:Explainable ML

——欲速则不达&#xff0c;我已经很幸运了&#xff0c;只要珍惜这份幸运就好了&#xff0c;不必患得患失&#xff0c;慢慢来。 ----查漏补缺&#xff1a; 1.关于这个os.listdir的使用 2.从‘num_文件名.jpg’中提取出数值&#xff1a; 3.slic图像分割标记函数的作用&#xf…

怎么选择AI伪原创工具-AI伪原创工具有哪些

在数字时代&#xff0c;创作和发布内容已经成为了一种不可或缺的活动。不论您是个人博主、企业家还是网站管理员&#xff0c;都会面临一个共同的挑战&#xff1a;如何在互联网上脱颖而出&#xff0c;吸引更多的读者和访客。而正是在这个背景下&#xff0c;AI伪原创工具逐渐崭露…

DAZ To UMA⭐一.DAZ简单使用教程

文章目录 &#x1f7e5; DAZ快捷键&#x1f7e7; DAZ界面介绍 &#x1f7e5; DAZ快捷键 移动物体:ctrlalt鼠标左键 旋转物体:ctrlalt鼠标右键 导入模型:双击左侧模型UI &#x1f7e7; DAZ界面介绍 Files:显示全部文件 Products:显示全部产品 Figures:安装的全部人物 Wardrobe…

ubuntu 18.04 中 eBPF samples/bpf 编译

1. history 信息 一次成功编译 bpf 后执行 history 得到的信息&#xff1a; yingzhiyingzhi-Host:~/ex/ex_kernel/linux-5.4$ history1 ls2 mkdir ex3 cd ex4 mkdir ex_kernel5 ls /boot/6 sudo apt install linux-source7 ls /usr/src/8 uname -r9 cd ex_kernel/10…