Phone: 158 4018 8888 Email: 407593529@qq.com

计划任务开发

2026-02-25 15:09:39 2

计划任务

简介

过去,你可能需要在服务器上为每一个调度任务去创建 Cron 条目。因为这些任务的调度不是通过代码控制的,你要查看或新增任务调度都需要通过 SSH 远程登录到服务器上去操作,使用起来不是很方便。
现在你可以通过项目内置的任务调度器在项目中清晰明了地实现计划任务。

1.定义任务模板及任务类

你可以在 \niucloud\app\dict\schedule\schedule.php 类中新增任务项 在开始之前,我们来看一个例子:我们计划每天凌晨一点二十分执行一个订单关闭的任务:

<?php

return [
    [
        'key' => 'order_close',//任务标识
        'name' => '未支付订单自动关闭',//任务名称
        'desc' => '',//任务介绍
        'time' => [
            'type' => 'day',//任务调度频率类型
            'day' => 1,//每隔几日
            'hour' => 1,//当日执行时间具体小时数
            'min' => 20,//当日执行时间具体分钟数
        ],
        'class' => '',
        'function' => ''
    ]
];


特别注意:修改传参后需要重启重启 workerman 在可生效!!!

  • key值代表任务模板的标识,必须是惟一的。
  • name 任务名称。
  • time任务频率间隔
  • class 任务消费层所在类的路径,如果为空的话会自动在niucloud\app\job\schedule\路径下寻找当前任务key值下划线转驼峰的类
  • function任务调用方法

任务调度频率类型

time 下的type代表任务的调度频率

  • type为min,min为1表示每分钟运行一次任务
  • type为hour,hour为1 min为1表示每隔一小时的第几分钟运行一次任务
  • type为day,day为1 hour为1 min为1表示每隔一日的1时1分运行一次任务
  • type为week,week为1 hour为1 min为1表示每周周一的1时1分运行一次任务
  • type为month,day为1 hour为1 min为1表示每月一号的1时1分运行一次任务

任务模板class值(任务消费类的位置)和function(方法名)

任务消费类所在位置,默认可以为空,如果为空的话会自动在niucloud\app\job\schedule\路径下寻找当前任务key值下划线转驼峰的类,如果不为空的话

  1. class值如果为空的话自动在niucloud\app\job\schedule\路径下寻找当前任务key值下划线转驼峰的类
<?php

return [
    [
        'key' => 'order_close',//任务标识
        'name' => '未支付订单自动关闭',//任务名称
        'desc' => '',//任务介绍
        'time' => [
            'type' => 'day',//任务调度频率类型
            'day' => 1,//每隔几日
            'hour' => 1,//当日执行时间具体小时数
            'min' => 20,//当日执行时间具体分钟数
        ],
        'class' => '',
        'function' => ''
    ]
];

如果OrderClose类不存在,就在niucloud\app\job\schedule\路径下创建一个OrderClose类

<?php
namespace app\job\schedule;

use core\base\BaseJob;
use think\facade\Log;

/**
 * 队列异步调用定时任务
 */
class OrderClose extends BaseJob
{
    public function doJob()
    {
        //具体的任务代码
      	//......
        return true;
    }
}

  1. class值如果存在值的话,会直接通过class路径去直接寻找任务类
<?php

return [
    [
        'key' => 'order_close',//任务标识
        'name' => '未支付订单自动关闭',//任务名称
        'desc' => '',//任务介绍
        'time' => [
            'type' => 'day',//任务调度频率类型
            'day' => 1,//每隔几日
            'hour' => 1,//当日执行时间具体小时数
            'min' => 20,//当日执行时间具体分钟数
        ],
        'class' => 'app\job\schedule\OrderClose1',
        'function' => ''
    ]
];

namespace app\job\schedule;

use core\base\BaseJob;
use think\facade\Log;

/**
 * 队列异步调用定时任务
 */
class OrderClose1 extends BaseJob
{
    public function doJob()
    {
        //具体的任务代码
      	//......
        return true;
    }
}

  1. function值如果为空值的话会默认调用doJob方法
<?php

return [
    [
        'key' => 'order_close',//任务标识
        'name' => '未支付订单自动关闭',//任务名称
        'desc' => '',//任务介绍
        'time' => [
            'type' => 'day',//任务调度频率类型
            'day' => 1,//每隔几日
            'hour' => 1,//当日执行时间具体小时数
            'min' => 20,//当日执行时间具体分钟数
        ],
        'class' => '',
        'function' => ''
    ]
];

namespace app\job\schedule;

use core\base\BaseJob;
use think\facade\Log;

/**
 * 队列异步调用定时任务
 */
class OrderClose extends BaseJob
{
    public function doJob()
    {
        //具体的任务代码
      	//......
        return true;
    }
}

  1. function值如果不为空值的话会在class类内部直接调用
<?php

return [
    [
        'key' => 'order_close',//任务标识
        'name' => '未支付订单自动关闭',//任务名称
        'desc' => '',//任务介绍
        'time' => [
            'type' => 'day',//任务调度频率类型
            'day' => 1,//每隔几日
            'hour' => 1,//当日执行时间具体小时数
            'min' => 20,//当日执行时间具体分钟数
        ],
        'class' => '',
        'function' => 'doJob1'
    ]
];

<?php
namespace app\job\schedule;

use core\base\BaseJob;
use think\facade\Log;

/**
 * 队列异步调用定时任务
 */
class OrderClose extends BaseJob
{
    public function doJob1()
    {
        //具体的任务代码
      	//......
        return true;
    }
}

2.添加计划任务到数据库

任务添加到模板之后,这时候任务还不能使用,还需要将任务模板写入到数据库中

  1. 进入应用 - 开发 - 计划任务

    2点击添加任务,选择之前添加的任务模板,然后选择任务调度频率,点击确认任务就添加成功了

3.启动计划任务

  1. 直接在终端运行命令
php think workerman 

2结合项目所在服务器系统的计划任务来使用

* * * * cd /您的项目路径 && php think cron:run >> /dev/null 2>&1  

4.调试完毕后,可以使用 Supervisor 来保持队列的进程常驻。

参考配置:

[program:cron-schedule ]
command=php think cron:schedule 
directory=/www/wwwroot/您的项目路径/
user=www
priority=999
numprocs=1

也可以配合宝塔使用

选择样式

选择布局
选择颜色
选择背景
选择背景