需求:
根據(jù)用戶的設置,比如每天凌晨3點,執(zhí)行一個定時任務
這個定時任務,執(zhí)行的時間,是根據(jù)用戶的設置來的\
最關鍵的問題是,這個設置可能會經(jīng)常變化
可能今天用戶設置為每天凌晨3點執(zhí)行
可能明天用戶設置為每天凌晨7點執(zhí)行
這種情況,有沒有可行的思路或者方案呢?
設置一個定時任務每分鐘跑一遍用來執(zhí)行設置用戶的定時任務
其實crontab如果不是那種要求精確到秒執(zhí)行的,我更傾向走命令行,思路大概就是兩種:
1.一個MainCronTask在命令行下1分鐘運行一次,邏輯就是檢測是否有剛好這個時間需要執(zhí)行的計劃任務SubCronTask,有則執(zhí)行
2.還是MainCronTask在命令行下1分鐘運行一次,邏輯就是執(zhí)行所有的計劃任務SubCronTask,至于實際是否執(zhí)行,有具體計劃任務自身判斷
但是要注意處理前一個計劃任務執(zhí)行時間過長,導致前一個計劃任務(不管是Main還是Sub)沒有執(zhí)行完,又到了下一個執(zhí)行時間的問題
做一個專門單個定時任務進程,當有定時任務時,推送到定時任務進程上,然后在定時任務進程上 啟動 定時任務 ,并且保存 定時任務對象,當需要關閉定時任務時,推送到 定時任務進程 在進程上拿 定時任務對象 進行關閉。 感覺這樣子應該可以,沒有實際操作過
插件已經(jīng)寫好了
composer require yzh52521/webman-task
歡迎大家測試
webman啟動后運行有報錯是哪里還需要設置嗎,ErrorException: stream_socket_client(): unable to connect to tcp://0.0.0.0:2345 (在其上下文中,該請求的地址無效。
) in D:\www\webman\vendor\yzh52521\webman-task\src\Client.php:14
1.think-orm已安裝,少安裝了crontab(后面已安裝)
2.ip地址改成了127.0.0.1:8787(沒有報ip錯誤了)
現(xiàn)在日志里的錯誤是: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());
}
//定時任務
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',//計劃任務列表
'args' => ['limit' => 10, 'page' => 1]//參數(shù)
];/
$param = [
'method' => 'crontabCreate',//計劃任務列表
'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
報錯
CREATE TABLE `system_crontab` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任務標題',
`type` tinyint(1) NOT NULL DEFAULT '1' COMMENT '任務類型 (1 command, 2 class, 3 url, 4 eval)',
`rule` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任務執(zhí)行表達式',
`target` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '調(diào)用任務字符串',
`running_times` int NOT NULL DEFAULT '0' COMMENT '已運行次數(shù)',
`last_running_time` int NOT NULL DEFAULT '0' COMMENT '上次運行時間',
`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 '任務狀態(tài)狀態(tài)[0:禁用;1啟用]',
`create_time` int NOT NULL DEFAULT '0' COMMENT '創(chuàng)建時間',
`update_time` int NOT NULL DEFAULT '0' COMMENT '更新時間',
`singleton` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否單次執(zhí)行 (0 是 1 不是)',
`parameter` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任務調(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='定時器任務表';
CREATE TABLE `system_crontab_log` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`crontab_id` bigint unsigned NOT NULL COMMENT '任務id',
`target` varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT '任務調(diào)用目標字符串',
`parameter` varchar(500) COLLATE utf8mb4_general_ci NOT NULL COMMENT '任務調(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í)行所用時間',
`create_time` int NOT NULL DEFAULT '0' COMMENT '創(chuàng)建時間',
`update_time` int NOT NULL DEFAULT '0' COMMENT '更新時間',
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='定時器任務執(zhí)行日志表';
你對照下數(shù)據(jù)庫是不是少字段
我知道了, http://www.wtbis.cn/plugin/42 你看下 文檔
$param = [
'method' => 'crontabCreate',
'args' => [
'title' => '輸出 webman 版本',
'type' =>1,
'rule' => '*/30 * * * * *',
'target' => 'php webman version',
'status' => 1,
'remark' => '每30秒執(zhí)行',
]
];
最新版 字段有變動