# 定时任务创建速查手册
# 概述
定时任务系统基于 taskmgr 模块,支持秒级精度的 cron 表达式,通过队列机制异步执行。
# 创建步骤
# 1. 创建任务处理类
按 a/b/c 分层目录规则创建:{app}/{module}/lib/autotask/timer/{taskname}.php
<?PHP
/**
* 任务描述
*
* @author 作者
* @version 版本
*/
class {app}_autotask_timer_{taskname}
{
public function process($params, &$error_msg=''){
set_time_limit(0);
ignore_user_abort(1);
// 任务逻辑
try {
// 具体业务处理
return true;
} catch (Exception $e) {
$error_msg = $e->getMessage();
return false;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 2. 注册到白名单
在 app/taskmgr/lib/whitelist.php 的 timer_list() 方法中添加:
'{taskname}' => array(
'method' => '{app}_autotask_timer_{taskname}',
'threadNum' => 1
),
1
2
3
4
2
3
4
# 3. 配置定时规则
在 app/taskmgr/lib/whitelist.php 的 init_list() 方法中添加对应的初始化任务:
'{taskname}domainqueue' => array(
'threadNum' => 1,
'rule' => '0 */20 * * * *', // 每20分钟执行一次
),
1
2
3
4
2
3
4
注意:定时任务必须同时配置 timer_list() 和 init_list(),两者配合使用:
timer_list():定义任务处理类和方法init_list():定义执行频率和触发规则
# 完整示例
# check_order_is_delivery 任务实现
参考 monitor_autotask_timer_checkorderisdelivery 的完整实现:
<?php
class monitor_autotask_timer_checkorderisdelivery
{
public function process($params, &$error_msg = '')
{
set_time_limit(0);
ignore_user_abort(1);
@ini_set('memory_limit', '1024M');
$now = time() - 180;
$last = strtotime('-1 week');
$sql = "select order_bn,order_bool_type from sdb_ome_orders where is_delivery='N' and status='active' and createtime<{$now} and createtime>{$last} and process_status in ('unconfirmed','confirmed')";
$list = kernel::database()->select($sql);
foreach($list as $k => $order) {
if($order['order_bool_type'] & ome_order_bool_type::__RISK_CODE) {
unset($list[$k]);
}
}
if($list) {
kernel::single('monitor_event_notify')->addNotify('order_360buy_delivery_error', [
'order_bn' => implode(', ', array_column($list, 'order_bn'))
]);
}
return true;
}
}
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
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
# 对应的白名单配置
在 whitelist.php 中需要同时配置两个方法:
// timer_list() 方法中
'check_order_is_delivery' => array(
'method'=>'monitor_autotask_timer_checkorderisdelivery',
'threadNum' => 1
),
// init_list() 方法中
'check_order_is_deliverydomainqueue'=>array(
'threadNum' => 1,
'rule' => '0 */20 * * * *', // 每20分钟执行一次
),
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 代码模板
# 基础模板
<?PHP
class ome_autotask_timer_example
{
public function process($params, &$error_msg=''){
set_time_limit(0);
ignore_user_abort(1);
// 防重复执行
$key = 'ome_autotask_timer_example';
if(cachecore::fetch($key)) {
$error_msg = '正在运行,请稍后!';
return false;
}
cachecore::store($key, 'running', 3600);
try {
// 业务逻辑
$result = $this->doTask();
cachecore::delete($key);
return $result;
} catch (Exception $e) {
cachecore::delete($key);
$error_msg = $e->getMessage();
return false;
}
}
private function doTask() {
// 具体任务实现
return true;
}
}
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
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
# 带参数验证模板
<?PHP
class ome_autotask_timer_with_params
{
public function process($params, &$error_msg=''){
set_time_limit(0);
ignore_user_abort(1);
// 参数验证
if (!$this->validateParams($params)) {
$error_msg = '参数无效';
return false;
}
// 执行任务
return $this->execute($params);
}
private function validateParams($params) {
return isset($params['required_field']);
}
private function execute($params) {
// 任务执行逻辑
return true;
}
}
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
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
# 关键文件路径
- 任务处理类:
app/{app}/lib/autotask/timer/{taskname}.php - 白名单配置:
app/taskmgr/lib/whitelist.phptimer_list()方法:定义任务处理类init_list()方法:定义执行频率
- 定时器核心:
app/taskmgr/lib/swtask/timer.php - 队列处理:
app/taskmgr/lib/swtask/worker.php - RPC入口:
app/taskmgr/lib/rpc/entrance.php - cron 解析:
app/taskmgr/lib/swtask/parsecrontab.php
# 搜索关键词
ome_autotask_timer_taskmgr_whitelist::timer_listtaskmgr_whitelist::init_listtaskmgr_swtask_timerautotask.*timerdomainqueue
# 测试用例
- 测试文件:
tests/taskmgr/timer_task_test.php - 测试方法:验证任务类实例化和 process 方法调用
# 注意事项
- 所有定时任务类必须实现
process($params, &$error_msg)方法 - 线程数固定为 1,不允许修改
- 建议添加防重复执行机制
- 异常处理必须设置
$error_msg - 长时间任务需要设置
set_time_limit(0) - 必须同时配置
timer_list()和init_list(),缺一不可 init_list()中的任务名必须以domainqueue结尾- cron 表达式支持6位格式:秒 分 时 日 月 周
- 建议设置合理的内存限制:
@ini_set('memory_limit', '512M')