参考:
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);
}
//任务1
public function testCrond1() {
Db::name('test')->insert(['crond_id' => '1', 'date' => date('YmdHis')]);
}
//任务2
public function testCrond2() {
Db::name('test')->insert(['crond_id' => '2', 'date' => date('YmdHis')]);
}
//任务3
public 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文件