# 計劃任務
## 簡介
過去,你可能需要在服務器上為每一個調度任務去創建 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云存儲配置
- 三方開放平臺小程序托管
- 計劃任務配置
- 站點域名配置
- 小票打印配置
- 電子面單配置
- 微信小程序客服配置
- 微信打款配置