需求:
根據(jù)用戶的設(shè)置,比如每天凌晨3點(diǎn),執(zhí)行一個(gè)定時(shí)任務(wù)
這個(gè)定時(shí)任務(wù),執(zhí)行的時(shí)間,是根據(jù)用戶的設(shè)置來的\
最關(guān)鍵的問題是,這個(gè)設(shè)置可能會(huì)經(jīng)常變化
可能今天用戶設(shè)置為每天凌晨3點(diǎn)執(zhí)行
可能明天用戶設(shè)置為每天凌晨7點(diǎn)執(zhí)行
這種情況,有沒有可行的思路或者方案呢?
設(shè)置一個(gè)定時(shí)任務(wù)每分鐘跑一遍用來執(zhí)行設(shè)置用戶的定時(shí)任務(wù)
其實(shí)crontab如果不是那種要求精確到秒執(zhí)行的,我更傾向走命令行,思路大概就是兩種:
1.一個(gè)MainCronTask在命令行下1分鐘運(yùn)行一次,邏輯就是檢測(cè)是否有剛好這個(gè)時(shí)間需要執(zhí)行的計(jì)劃任務(wù)SubCronTask,有則執(zhí)行
2.還是MainCronTask在命令行下1分鐘運(yùn)行一次,邏輯就是執(zhí)行所有的計(jì)劃任務(wù)SubCronTask,至于實(shí)際是否執(zhí)行,有具體計(jì)劃任務(wù)自身判斷
但是要注意處理前一個(gè)計(jì)劃任務(wù)執(zhí)行時(shí)間過長,導(dǎo)致前一個(gè)計(jì)劃任務(wù)(不管是Main還是Sub)沒有執(zhí)行完,又到了下一個(gè)執(zhí)行時(shí)間的問題
做一個(gè)專門單個(gè)定時(shí)任務(wù)進(jìn)程,當(dāng)有定時(shí)任務(wù)時(shí),推送到定時(shí)任務(wù)進(jìn)程上,然后在定時(shí)任務(wù)進(jìn)程上 啟動(dòng) 定時(shí)任務(wù) ,并且保存 定時(shí)任務(wù)對(duì)象,當(dāng)需要關(guān)閉定時(shí)任務(wù)時(shí),推送到 定時(shí)任務(wù)進(jìn)程 在進(jìn)程上拿 定時(shí)任務(wù)對(duì)象 進(jìn)行關(guān)閉。 感覺這樣子應(yīng)該可以,沒有實(shí)際操作過
插件已經(jīng)寫好了
composer require yzh52521/webman-task
歡迎大家測(cè)試
webman啟動(dòng)后運(yùn)行有報(bào)錯(cuò)是哪里還需要設(shè)置嗎,ErrorException: stream_socket_client(): unable to connect to tcp://0.0.0.0:2345 (在其上下文中,該請(qǐng)求的地址無效。
) in D:\www\webman\vendor\yzh52521\webman-task\src\Client.php:14
unable to connect to tcp://0.0.0.0:2345,看起來是ip地址不對(duì),應(yīng)該是127.0.0.1 才對(duì)吧
1.think-orm已安裝,少安裝了crontab(后面已安裝)
2.ip地址改成了127.0.0.1:8787(沒有報(bào)ip錯(cuò)誤了)
現(xiàn)在日志里的錯(cuò)誤是:default.ERROR: json_decode() expects parameter 1 to be string, bool given {"exception":"TypeError: json_decode() expects parameter 1 to be string, bool given in D:\www\webman\vendor\yzh52521\webman-task\src\Client.php:33
<?php
namespace app\controller;
use support\Request;
use support\log;
use think\facade\Db;
use Workerman\Crontab\Crontab;
class Test
{
public function add(Request $request)
{
return json(Db::name('users')->select()->toArray());
}
//定時(shí)任務(wù)
public function crontab()
{
$crontab = new Crontab('1 ', function(){
echo date('Y-m-d H:i:s')."\n";
});
Log::info('log test123',['AAA'=>123,'BB'=>222]);
/$param = [
'method' => 'crontabIndex',//計(jì)劃任務(wù)列表
'args' => ['limit' => 10, 'page' => 1]//參數(shù)
];/
$param = [
'method' => 'crontabCreate',//計(jì)劃任務(wù)列表
'args' => [
'title' => '輸出webman版本',
'frequency' => '/30 *',
'shell' => 'php webman version',
'remark' => '每30秒執(zhí)行',
'sort' => 0,
'status' => 1
]//參數(shù)
];
$result = \yzh52521\Task\Client::instance()->request($param);
print_r($result);
//return json($result);
//return response($result);
}
}
列表
public function cron_index()
{
$request = [
'method' => 'crontabIndex',
'args' => ['limit' => 10, 'page' => 1]
];
$result = \yzh52521\Task\Client::instance()->request($request);
return json($result);
}
添加
public function cron_create()
{
$request = [
'method' => 'crontabCreate',
'args' => [
'title' => '輸出 webman 版本',
'frequency' => '*/20 * * * * *',
'shell' => 'php webman version',
'status' => 1,
'remark' => '20秒',
]
];
$result = \yzh52521\Task\Client::instance()->request($request);
return json($result);
}
TypeError: json_decode() expects parameter 1 to be string, bool given in E:\www\1043huicmf_webman\vendor\yzh52521\webman-task\src\Client.php:36
Stack trace:
@yzh52521
報(bào)錯(cuò)
CREATE TABLE `system_crontab` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任務(wù)標(biāo)題',
`type` tinyint(1) NOT NULL DEFAULT '1' COMMENT '任務(wù)類型 (1 command, 2 class, 3 url, 4 eval)',
`rule` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任務(wù)執(zhí)行表達(dá)式',
`target` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '調(diào)用任務(wù)字符串',
`running_times` int NOT NULL DEFAULT '0' COMMENT '已運(yùn)行次數(shù)',
`last_running_time` int NOT NULL DEFAULT '0' COMMENT '上次運(yùn)行時(shí)間',
`remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '備注',
`sort` int NOT NULL DEFAULT '0' COMMENT '排序,越大越前',
`status` tinyint NOT NULL DEFAULT '0' COMMENT '任務(wù)狀態(tài)狀態(tài)[0:禁用;1啟用]',
`create_time` int NOT NULL DEFAULT '0' COMMENT '創(chuàng)建時(shí)間',
`update_time` int NOT NULL DEFAULT '0' COMMENT '更新時(shí)間',
`singleton` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否單次執(zhí)行 (0 是 1 不是)',
`parameter` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任務(wù)調(diào)用參數(shù)',
PRIMARY KEY (`id`) USING BTREE,
KEY `title` (`title`) USING BTREE,
KEY `create_time` (`create_time`) USING BTREE,
KEY `status` (`status`) USING BTREE,
KEY `type` (`type`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='定時(shí)器任務(wù)表';
CREATE TABLE `system_crontab_log` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`crontab_id` bigint unsigned NOT NULL COMMENT '任務(wù)id',
`target` varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT '任務(wù)調(diào)用目標(biāo)字符串',
`parameter` varchar(500) COLLATE utf8mb4_general_ci NOT NULL COMMENT '任務(wù)調(diào)用參數(shù)',
`exception` text COLLATE utf8mb4_general_ci NOT NULL COMMENT '異常信息輸出',
`return_code` tinyint(1) NOT NULL DEFAULT '0' COMMENT '執(zhí)行返回狀態(tài)[0成功; 1失敗]',
`running_time` varchar(10) COLLATE utf8mb4_general_ci NOT NULL COMMENT '執(zhí)行所用時(shí)間',
`create_time` int NOT NULL DEFAULT '0' COMMENT '創(chuàng)建時(shí)間',
`update_time` int NOT NULL DEFAULT '0' COMMENT '更新時(shí)間',
PRIMARY KEY (`id`) USING BTREE,
KEY `create_time` (`create_time`) USING BTREE,
KEY `crontab_id` (`crontab_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=392 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='定時(shí)器任務(wù)執(zhí)行日志表';
你對(duì)照下數(shù)據(jù)庫是不是少字段
我知道了, http://wtbis.cn/plugin/42 你看下 文檔
$param = [
'method' => 'crontabCreate',
'args' => [
'title' => '輸出 webman 版本',
'type' =>1,
'rule' => '*/30 * * * * *',
'target' => 'php webman version',
'status' => 1,
'remark' => '每30秒執(zhí)行',
]
];
最新版 字段有變動(dòng)