# 定时任务创建速查手册

# 概述

定时任务系统基于 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. 注册到白名单

app/taskmgr/lib/whitelist.phptimer_list() 方法中添加:

'{taskname}' => array(
    'method' => '{app}_autotask_timer_{taskname}', 
    'threadNum' => 1
),
1
2
3
4

# 3. 配置定时规则

app/taskmgr/lib/whitelist.phpinit_list() 方法中添加对应的初始化任务:

'{taskname}domainqueue' => array(
    'threadNum' => 1,
    'rule'      => '0 */20 * * * *',  // 每20分钟执行一次
),
1
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

# 对应的白名单配置

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

# 代码模板

# 基础模板

<?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

# 带参数验证模板

<?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

# 关键文件路径

  • 任务处理类:app/{app}/lib/autotask/timer/{taskname}.php
  • 白名单配置:app/taskmgr/lib/whitelist.php
    • timer_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_list
  • taskmgr_whitelist::init_list
  • taskmgr_swtask_timer
  • autotask.*timer
  • domainqueue

# 测试用例

  • 测试文件:tests/taskmgr/timer_task_test.php
  • 测试方法:验证任务类实例化和 process 方法调用

# 注意事项

  1. 所有定时任务类必须实现 process($params, &$error_msg) 方法
  2. 线程数固定为 1,不允许修改
  3. 建议添加防重复执行机制
  4. 异常处理必须设置 $error_msg
  5. 长时间任务需要设置 set_time_limit(0)
  6. 必须同时配置 timer_list()init_list(),缺一不可
  7. init_list() 中的任务名必须以 domainqueue 结尾
  8. cron 表达式支持6位格式:秒 分 时 日 月 周
  9. 建议设置合理的内存限制:@ini_set('memory_limit', '512M')
最后更新: 11/11/2025, 9:12:34 PM