别人问怎么做定时任务?我说当然是crontab啊!!!做为一个PHPER
只会用crontab真不好意思。不过,以下是基于常驻进程框架结合mysql
做的定时信号。至少实现了定时不是?
- 1,在项目要根目录安装依赖
composer require workerman/workerman 2,创建
start.php并写入1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/**
* 使用说明
* 先切换到项目根目录下
* 启动 php start.php start 这是调试模式,信息会直接echo出来 停止 按ctrl+c
* 后台启动 php start.php start -d 如果在调试模式下测试没有问题了。 真正使用的用后台模式,这样就算你人离线了程序也会在后台运行
* 关闭后台 php start.php stop
*
*/
require_once __DIR__ . "/vendor/autoload.php";
use \Workerman\Worker;
use \Workerman\Lib\Timer;
// 检查扩展
if(!extension_loaded('pcntl')) exit("需要pcntl扩展");
if(!extension_loaded('posix')) exit("需要posix扩展");
if(!extension_loaded('pdo')) exit("需要pdo扩展");
if(!extension_loaded('pdo_mysql')) exit("需要pdo_mysql扩展");
$task = new Worker();
// 开启多少个进程运行定时任务,注意业务是否在多进程有并发问题
$task->count = 1;
$task->onWorkerStart = function($task)
{
// 定时让程序每60秒执行一次
$time_interval = 60;
Timer::add($time_interval, function()
{
//连接数据库
$db = new \Workerman\MySQL\Connection(
'127.0.0.1', // host
'3306', //port
'root', //username
'123qwe', //password
'crontab' //db_name 数据名
);
$has_data = $db->query("SELECT * FROM `task`");
if ($has_data) {
//当前时间
date_default_timezone_set("PRC");
$minute = date('i', time()); //当前分
$hour = date('H', time()); //当前时
$today = date('d', time()); //当前天
$month = date('m', time()); //当前月
$week = date('w', time()); //当前周
foreach($has_data as $task)
{
switch($task['type']) {
case 1 :
//每小时任务
if($task['minute'] == $minute) {
echo $task['task'] . "\n";
}
break;
case 2 : // 每天任务
if($task['hour'] == $hour && $task['minute'] == $minute) {
echo $task['task'] . "\n";
}
break;
case 3 : // 每月任务
if($task['hour'] == $hour && $task['minute'] == $minute && $task['day'] == $today) {
echo $task['task'] . "\n";
}
break;
case 4 : // 每星期每小时任务
if($task['week'] == $week && $task['minute'] == $minute) {
echo $task['task'] . "\n";
}
break;
case 5 : // 每星期任务
if($task['week'] == $week && $task['minute'] == $minute && $task['hour'] == $hour) {
echo $task['task'] . "\n";
}
break;
}
}
}
});
};
// 运行worker
Worker::runAll();3,数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76-- phpMyAdmin SQL Dump
-- version 4.8.5
-- https://www.phpmyadmin.net/
--
-- Host: localhost
-- Generation Time: Jul 03, 2019 at 06:48 AM
-- Server version: 10.3.15-MariaDB
-- PHP Version: 7.3.5
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- Database: `crontab`
--
-- --------------------------------------------------------
--
-- Table structure for table `task`
--
CREATE TABLE `task` (
`t_id` int(10) NOT NULL,
`minute` int(2) DEFAULT NULL COMMENT '分',
`hour` int(2) DEFAULT NULL COMMENT '时',
`day` int(2) DEFAULT NULL COMMENT '日',
`month` int(2) DEFAULT NULL COMMENT '月',
`week` int(2) DEFAULT NULL COMMENT '周',
`task` varchar(250) DEFAULT NULL COMMENT '任务',
`type` int(1) NOT NULL DEFAULT 1 COMMENT '类型1每小时,2每天,3每月,4每个星期每小时,5每个星期每小时'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Dumping data for table `task`
--
INSERT INTO `task` (`t_id`, `minute`, `hour`, `day`, `month`, `week`, `task`, `type`) VALUES
(1, 34, NULL, NULL, NULL, NULL, '每小时任务:你的任务是每个小时34分执行一次', 1),
(2, 35, 14, NULL, NULL, NULL, '每天任务:你的任务是14:35执行一次', 2),
(3, 36, 14, 3, NULL, NULL, '月期任务:你的任务是每个月 3号14:36执行一次', 3),
(4, 37, NULL, NULL, NULL, 3, '周期每小时任务:你的任务是每个星期3每个小时的37分执行一次', 4),
(5, 38, 14, NULL, NULL, 3, '周期小时任务:你的任务是每个星期01:01执行一次', 5);
--
-- Indexes for dumped tables
--
--
-- Indexes for table `task`
--
ALTER TABLE `task`
ADD PRIMARY KEY (`t_id`);
--
-- AUTO_INCREMENT for dumped tables
--
--
-- AUTO_INCREMENT for table `task`
--
ALTER TABLE `task`
MODIFY `t_id` int(10) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;
COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;