# 计划任务
## 简介  
过去,你可能需要在服务器上为每一个调度任务去创建 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;
    }
}
```
2.  class值如果存在值的话,会直接通过class路径去直接寻找任务类  
```
<?php
return [
    [
        'key' => 'order_close',//任务标识
        'name' => '未支付订单自动关闭',//任务名称
        'desc' => '',//任务介绍
        'time' => [
            'type' => 'day',//任务调度频率类型
            'day' => 1,//每隔几日
            'hour' => 1,//当日执行时间具体小时数
            'min' => 20,//当日执行时间具体分钟数
        ],
        'class' => 'app\job\schedule\OrderClose1',
        'function' => ''
    ]
];
```
```<?php
namespace app\job\schedule;
use core\base\BaseJob;
use think\facade\Log;
/**
 * 队列异步调用定时任务
 */
class OrderClose1 extends BaseJob
{
    public function doJob()
    {
        //具体的任务代码
      	//......
        return true;
    }
}
```
3.  function值如果为空值的话会默认调用doJob方法  
```
<?php
return [
    [
        'key' => 'order_close',//任务标识
        'name' => '未支付订单自动关闭',//任务名称
        'desc' => '',//任务介绍
        'time' => [
            'type' => 'day',//任务调度频率类型
            'day' => 1,//每隔几日
            'hour' => 1,//当日执行时间具体小时数
            'min' => 20,//当日执行时间具体分钟数
        ],
        'class' => '',
        'function' => ''
    ]
];
```
```<?php
namespace app\job\schedule;
use core\base\BaseJob;
use think\facade\Log;
/**
 * 队列异步调用定时任务
 */
class OrderClose extends BaseJob
{
    public function doJob()
    {
        //具体的任务代码
      	//......
        return true;
    }
}
```
4.  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](https://blog.ll00.cn/archives/4.html) 来保持队列的进程常驻。  
参考配置:  
```
[program:cron-schedule ]
command=php think cron:schedule 
directory=/www/wwwroot/您的项目路径/
user=www
priority=999
numprocs=1
```
也可以配合宝塔使用  

  
*****
:-: 若有收获,就点个赞吧
                    
        - 源码下载
 - 安装部署
 - 环境要求
 - 安装视频教程
 - 宝塔部署
 - 授权绑定
 - 二次开发须知
 - 技术栈
 - 目录结构
 - 命名规范
 - 二次开发指导
 - 二次开发环境搭建步骤
 - 二次开发注意事项
 - 单站和Saas模式开发
 - 插件结构描述
 - MENU开发
 - DIY组件/页面开发
 - 自定义手机端DIY装修页面
 - Route 路由处理
 - Services中的core文件夹
 - 自定义站点管理端控制台页面样式
 - 调用素材资源
 - Resource资源文件
 - 引入图标ICON
 - SMS发送短信开发
 - Job 消息队列和计划任务
 - 消息队列
 - 计划任务开发
 - 生产环境编译打包处理步骤
 - 生产环境搭建步骤
 - 插件安装时npm,composer检测不可用问题处理
 - 上传图片大小限制修改
 - 插件uniapp开发
 - 菜单语言包
 - 插件打包
 - 插件内测在线升级
 - 自定义端口开发
 - 如何开发自定义布局后台布局
 - 二次开发应用插件视频教程
 - 二次开发安装视频教程
 - 准备工作与创建插件
 - 插件目录整体说明
 - 插件admin目录
 - 插件app目录说明(adminapi、api、验证器)
 - 插件app目录(dict、job)
 - 插件app目录说明(lang、listener)
 - 插件app目录说明(model、service)
 - 插件uniapp目录说明
 - 插件开发之后台功能开发(代码生成器)
 - 插件开发之uniapp功能开发(api)第一节
 - 插件开发之uniapp功能开发(api)第二节
 - 插件开发之uniapp功能开发(api)第三节
 - 插件安装与打包原理
 - 消息队列开发
 - 计划任务开发
 - DIY组件和自定义页面装修开发
 - 支付接口开发
 - 插件升级包打包流程以及云编译功能
 - 常见问题
 - 怎么添加菜单,添加了菜单不出现怎么回事
 - 站点site端(租户端、商家端)和saas管理端(平台端)究竟啥意思,有啥区别
 - 框架中是有订单表order,假如开发一个商城插件,请问商城的订单数据是不是重新搞一个订单表shop_order
 - 有些支付平台是绑定回调唯一网址或目录,如果有几个开发者开发插件都有支付那这块怎么解决?
 - 站点过期,可以登录,这样对吗?
 - 计划任务怎么启动啊
 - Git多分支开发,切换分支
 - 安装应用出现is_dir():报错处理方案
 - 绑定授权时出现“请求来源产品与授权产品不一致”解决方案
 - “未找到admin源码所在目录”的解决方案
 - 页面装修本地开发环境配置
 - 接口请求错误处理方案
 - 未获取到授权信息问题处理方案
 - 腾讯地图配置
 - 请求超时问题处理方案
 - 下载应用时提示找不到zip解决方案
 - 怎么关闭开发调试模式
 - 获取数据失败问题处理方案
 - 框架安装后,访问域名无法进入admin端(多数发生在本地)
 - 底部导航失效问题
 - 开放平台小程序审核通过发布失败问题
 - 先升级插件后升级框架,导致云编译报debounce的错误
 - 微信公众号自动回复不通
 - 修改访问域名默认跳转端口
 - 插件与框架的兼容问题处理
 - 升级提示mkdir()处理方案
 - 云编译时node.js内存不足导致内存溢出处理方案
 - 报错Allowed memory size of ** bytes exhausted (tried to allocate ** bytes)处理方法
 - 安装插件提示不适配框架版本的处理
 - 代码生成器
 - 设计数据表
 - 导入数据表
 - 添加字段
 - 代码生成
 - 效果预览
 - niucloud (服务端)
 - 服务端目录结构
 - 整体运行流程
 - 入口文件
 - 模块
 - 中间件
 - 控制器
 - 路由
 - 模型类
 - 服务类
 - 验证类
 - 消息队列
 - 开发消息队列
 - 多语言
 - 装载器
 - 短信发送
 - 上传文件
 - 第三方支付
 - 第三方登录
 - 数据字典装载器
 - 打印
 - 事件
 - 消息提醒(模版消息)
 - 数据字典
 - admin (后台管理端)
 - 准备工作
 - 新手入门
 - 目录结构
 - 系统配置
 - 路由
 - 接口
 - 管理端编译上传
 - uni-app(手机端前端)
 - 准备工作
 - 前端目录结构
 - Hbuilder开发
 - 发行h5
 - 运行uniapp
 - 发行uniapp
 - Visual Studio Code开发
 - 发行 uniapp
 - 运行 uniapp
 - 配置项
 - 路由
 - 接口
 - 分包建议
 - 手机端编译
 - 微信小程序编译上传
 - web端(PC前端)
 - 准备工作
 - 目录结构
 - 代码运行
 - 路由
 - 接口
 - 黑暗主题
 - web端打包上线
 - api接口
 - 配置手册
 - 阿里云oss云存储配置
 - 三方开放平台小程序托管
 - 计划任务配置
 - 站点域名配置
 - 小票打印配置
 - 电子面单配置
 - 微信小程序客服配置
 - 微信打款配置
 
