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.mzph.cn/news/86411.shtml

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

相关文章

FatFS文件系统在MCU上的应用

FatFS文件系统是单片机领域有名的一个文件系统&#xff0c;由于它的轻量级和兼容性&#xff0c;备受MCU开发者青睐。 在实现如U盘文件读写&#xff0c;SD卡的文件读写等工作时&#xff0c;我们往往需要一个文件系统来支持我们的工作。特别在一些MCU应用中&#xff0c;文件系统…

PPPoE配置

实验需求 配置IP地址使用PPPOE拨号上网设置路由让直播业务部和营销部都可以访问外网 实验拓扑 实验步骤 配置 R1地址池 电信链路&#xff1a; [Huawei]undo info-center enable Info: Information center is disabled. [Huawei]sysname r1 [r1]ip pool zhibo  //配置…

【沐风老师】3DMAX翻转折叠动画插件FoldFx使用方法详解

3DMAX翻转折叠动画插件FoldFx使用方法详解 3DMAX翻转折叠动画插件FoldFx,是3dMax运动图形工具,用于创建多边形折叠动画。用户几乎有无限的可能性,因为动画的每个方面都是可控的。 【适用版本】 适用于3dMax版本:2010及更新版本(推荐3dMax2016及更高版本)。 【安装方法】…

Go 围炉札记

文章目录 一、Go 安装 一、Go 安装 VScode下配置Go语言开发环境【2023最新】 基础篇&#xff1a;新手使用vs code新建go项目 vscode里安装Go插件和配置Go环境 Documentation Golang 配置代理 Go命令详解 一文详解Go语言常用命令 Go 语言教程 熬夜整理&#xff0c;最全的Go语…

大数据-玩转数据-Flink SQL编程

一、概念 1.1 Apache Flink 两种关系型 API Apache Flink 有两种关系型 API 来做流批统一处理&#xff1a;Table API 和 SQL。 Table API 是用于 Scala 和 Java 语言的查询API&#xff0c;它可以用一种非常直观的方式来组合使用选取、过滤、join 等关系型算子。 Flink SQL 是…

CSS 学习笔记(基础)

用来控制网页表现的语言&#xff0c;CSS&#xff08;Cascading Style Sheet&#xff09;&#xff1a;层叠样式表。然后我们继续看看 W3C 标准&#xff1a; 结构&#xff1a;HTML表现&#xff1a;CSS行为&#xff1a;JavaScript CSS导入方式、选择器&属性 由于网页的框架…

linux进程杀不死

项目场景&#xff1a; 虚拟机 问题描述 linux进程杀不死 无反应 原因分析&#xff1a; 进程僵死zombie 解决方案&#xff1a; 进proc或者find命令找到进程所在地址 cat status查看进程杀死子进程

linux系统中mysql 连接出现“too many connections”问题解决办法

问题内容&#xff1a; 原因: mysql配置参数中设定的并发连接数太少或者系统繁忙导致连接数被占满。连接数超过了 MySQL 设置的值&#xff0c; 与 max_connections 和 wait timeout 都有关&#xff0c;wait_timeout 的值越大&#xff0c;连接的空闲等待就越长&#xff0c; 这样就…

Linux忘记密码

在虚拟机安装了centOS7&#xff0c;但是忘记了root密码&#xff0c;登录的时候发现登录不上了&#xff0c;然后重新修改密码。 1、重启虚拟机 2、进入到该页面之后&#xff0c;选中第一个&#xff08;高亮显示即为选中&#xff09;选项&#xff0c;然后按下键盘的“E”键 3…

mybatis日志体系

title: “java日志体系” createTime: 2021-12-08T12:19:5708:00 updateTime: 2021-12-08T12:19:5708:00 draft: false author: “ggball” tags: [“mybatis”] categories: [“java”] description: “java日志体系” java日志体系 常用日志框架 Log4j&#xff1a;Apache …

74、SpringBoot 整合 Spring Data JDBC

总结&#xff1a;用起来跟 Spring Data JPA 差不多 什么是 JdbcTemplate&#xff1f;&#xff08;Template译为模板&#xff09; Spring 框架对 JDBC 进行封装&#xff0c;使用 JdbcTemplate 方便实现对数据库操作 ★ Spring Data JDBC 既不需要JPA、Hibernate这种ORM框架&a…

离线部署 python 3.x 版本

文章目录 离线部署 python 3.x 版本1. 下载版本2. 上传到服务器3. 解压并安装4. 新建软连信息5. 注意事项 离线部署 python 3.x 版本 1. 下载版本 python 各版本下载地址 本次使用版本 Python-3.7.0a2.tgz # linux 可使用 wget 下载之后上传到所需服务器 wget https://www.py…

gma 2 成书计划

随着 gma 2 整体构建完成。下一步计划针对库内所有功能完成一个用户指南&#xff08;非网站&#xff09;。 封皮 主要章节 章节完成度相关链接第 1 章 GMA 概述已完成第 2 章 地理空间数据操作已完成第 3 章 坐标参考系统已完成第 4 章 地理空间制图已完成第 5 章 数学运算模…

3288S Android11 适配红外遥控功能(超详细)

目录 一、rk3288平台红外遥控介绍二、原理图分析三、配置设备树并使能红外遥控功能四、打开红外打印功能&#xff0c;查看红外遥控的用户码和键值五、将查看到的红外遥控用户码和键值添加到设备树和.kl文件六、Android红外遥控.kl文件映射知识和使用添加新的.kl文件七、补充&am…

Unity中关于多线程的一些事

一.线程中不允许调用unity组件api 解决方法&#xff1a;可以使用bool值变化并且在update中监测bool值变化来调用关于unity组件的API. 二.打印并且将信息输出到list列表中 多线程可能同时输出多条信息。输出字符串可以放入Queue队列中。队列可以被多线程插入。 三.启用socke…

Python 网络爬取的时候使用那种框架

尽管现代的网站多采取前后端分离的方式进行开发了&#xff0c;但是对直接 API 的调用我们通常会有 token 的限制和可以调用频率的限制。 因此&#xff0c;在一些特定的网站上&#xff0c;我们可能还是需要使用网络爬虫的方式获得已经返回的 JSON 数据结构&#xff0c;甚至是处理…

【计算机毕业设计】基于SpringBoot+Vue记帐理财系统的设计与实现

博主主页&#xff1a;一季春秋博主简介&#xff1a;专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发&#xff0c;远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容&#xff1a;毕业设计(Java项目、小程序、安卓等)、简历模板、学习资料、…

C语言 coding style

头文件 The #define Guard #define的保护文件的唯一性&#xff0c;防止被多重包含 格式 : <PROJECT>_< FILE>_H_ PROJECT : XS FILE : MV_CTR 头文件的包含顺序 C System FilesOther LibrariesUser LibraryConditional include 作用域 局部变量 -变量定义时需要…

go语言unsafe.Pointer与uintptr

以下内容来源go语言圣经 1、unsafe.Pointer&#xff0c;相当于c语言中的void *类型的指针&#xff0c;如果需要运算需要转成uintptr类型的指针 2. uintptr uintptr是一个无符号的整型&#xff0c;它可以保存一个指针地址。 它可以进行指针运算。 uintptr无法持有对象, GC不把…

Kubernetes的容器批量调度引擎 Volcano

一个用于高性能工作负载场景下基于Kubernetes的容器批量调度引擎 Volcano是在Kubernetes上运行高性能工作负载的容器批量计算引擎。 它提供了Kubernetes目前缺少的一套机制&#xff0c;这些机制通常是许多高性能 工作负载所必需的&#xff0c;包括&#xff1a; - 机器学习/深度…