国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

workerman/crontab定時任務(wù)管理組件

2548a

workerman/crontab實(shí)現(xiàn)類似寶塔的任務(wù)管理

概述

基于 webman + workerman/crontab 的定時任務(wù)組件<br>
本組件代碼參考 webman crontab任務(wù)管理組件(多類型) http://m.wtbis.cn/plugin/42 <br>
重構(gòu)出來的。<br>

注意事項(xiàng)

僅支持linux,僅支持linux,僅支持linux。<br>
秒級任務(wù)不要小于5秒,每個進(jìn)程計(jì)時器會有差異,將會導(dǎo)致任務(wù)在同一秒執(zhí)行不同次數(shù)的任務(wù)

安裝

composer require fly-cms/webman-crontab

創(chuàng)建數(shù)據(jù)表

創(chuàng)建任務(wù)數(shù)據(jù)表。

 CREATE TABLE IF NOT EXISTS `cms_crontab`  (
  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任務(wù)標(biāo)題',
  `type` tinyint(1) NOT NULL DEFAULT 1 COMMENT '任務(wù)類型 (1 url, 2 eval 3 shell)',
  `task_cycle` tinyint(1) NOT NULL DEFAULT 1 COMMENT '任務(wù)周期',
  `cycle_rule` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '任務(wù)周期規(guī)則',
  `rule` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任務(wù)表達(dá)式',
  `target` text  COMMENT '調(diào)用任務(wù)字符串',
  `running_times` int(11) NOT NULL DEFAULT '0' COMMENT '已運(yùn)行次數(shù)',
  `last_running_time` int(11) NOT NULL DEFAULT '0' COMMENT '上次運(yùn)行時間',
  `status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '任務(wù)狀態(tài)狀態(tài)[0:禁用;1啟用]',
  `create_time` int(11) NOT NULL DEFAULT 0 COMMENT '創(chuàng)建時間',
  `delete_time` int(11) NOT NULL DEFAULT 0 COMMENT '軟刪除時間',
  `singleton` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否單次執(zhí)行 (0 是 1 不是)',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `title`(`title`) USING BTREE,
  INDEX `status`(`status`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '定時器任務(wù)表' ROW_FORMAT = DYNAMIC

創(chuàng)建日志數(shù)據(jù)表

CREATE TABLE IF NOT EXISTS `cms_crontab_log`  (
  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `crontab_id` bigint UNSIGNED NOT NULL COMMENT '任務(wù)id',
  `target` varchar(255) COMMENT '任務(wù)調(diào)用目標(biāo)字符串',
  `log` text  COMMENT '任務(wù)執(zhí)行日志',
  `return_code` tinyint(1) NOT NULL DEFAULT 0 COMMENT '執(zhí)行返回狀態(tài)[0成功; 1失敗]',
  `running_time` varchar(10) NOT NULL COMMENT '執(zhí)行所用時間',
  `create_time` int(11) NOT NULL DEFAULT 0 COMMENT '創(chuàng)建時間',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `create_time`(`create_time`) USING BTREE,
  INDEX `crontab_id`(`crontab_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '定時器任務(wù)執(zhí)行日志表' ROW_FORMAT = DYNAMIC

修改配置信息

請仔細(xì)觀看下面 getAllTask , getTask , writeRunLog ,updateTaskRunState 四個方法,并按要求實(shí)現(xiàn)類似結(jié)果<br>
示例代碼如下:<br>


return [
    'enable' => true,
    'listen'            => '0.0.0.0:2345',
    'debug'             => true, //控制臺輸出日志
    'write_log'         => true,// 是否記錄任務(wù)日志
    'redis' => [
        'host' => 'redis://127.0.0.1:6379',
        'options' => [
            'auth' => null,       // 密碼,字符串類型,可選參數(shù)
        ]
    ],
    'task_handle' => [ //任務(wù)操作類
        1 => \FlyCms\WebmanCrontab\event\UrlTask::class,
        2 => \FlyCms\WebmanCrontab\event\EvalTask::class,
        3 => \FlyCms\WebmanCrontab\event\ShellTask::class
    ],
    'getAllTask' => function(){
        //獲取所有任務(wù)
        return \app\model\CrontabModel::select()->toArray();
    },
    'getTask' => function($id){
        //獲取某個任務(wù)
        return \app\model\CrontabModel::where('id',$id)->find();
    },
    'writeRunLog' => function($insert_data){
        //寫入運(yùn)行日志,注意,這個是日志模型,跟其它方法的模型不一樣
        \app\model\CrontabLogModel::insertGetId($insert_data);
    },
    'updateTaskRunState' => function($id, $last_running_time){
        //更新任務(wù)最后運(yùn)行時間,這里要把運(yùn)行次數(shù)加 1
        return  \app\model\CrontabModel::where('id',$id)
            ->update([
                'last_running_time' => $last_running_time,
                'running_times' => \think\facade\Db::raw(' running_times + 1')
            ]);
    }
];

接著打開 process.php 示例如下:<br>
count 設(shè)置定時任務(wù)進(jìn)程數(shù)<br>
這里的端口要與上面配置的listen端口進(jìn)行對應(yīng)<br>
檢查寶塔或者服務(wù)器對應(yīng)防火墻端口是否打開

return [
    'webman-crontab'  => [
        'handler'     => \FlyCms\WebmanCrontab\Server::class,
        'count'       => 1,
        'listen' => 'text://0.0.0.0:2345',
    ]
];

用法

第一步,創(chuàng)建路由

use app\admin\controller\TaskSet;
use Webman\Route;

Route::any('/admin/taskSet/index',[TaskSet::class,'index']);
Route::any('/admin/taskSet/list',[TaskSet::class,'list']);
Route::any('/admin/taskSet/edit',[TaskSet::class,'edit']);
Route::any('/admin/taskSet/updateOne',[TaskSet::class,'updateOne']);
Route::any('/admin/taskSet/get',[TaskSet::class,'get']);
Route::any('/admin/taskSet/getLog',[TaskSet::class,'getLog']);
Route::any('/admin/taskSet/reloadTask',[TaskSet::class,'reloadTask']);
Route::any('/admin/taskSet/delete',[TaskSet::class,'delete']);

第二步,導(dǎo)入插件test目錄的TaskSet控制器類<br>
這里你需要做的功能是<br>
1 創(chuàng)建對應(yīng)模型類<br>
2 edit方法添加對應(yīng)的參數(shù)校驗(yàn)

第三步,導(dǎo)入插件test目錄的taskSet.html文件<br>
因?yàn)閯h掉項(xiàng)目封裝代碼原因,該文件只實(shí)現(xiàn)部分功能,僅供參考,實(shí)際請根據(jù)自己項(xiàng)目功能去修改

擴(kuò)展任務(wù)類型

插件app.php目錄里的 task_handle 數(shù)組配置任務(wù)解析類。

   'task_handle' => [ //任務(wù)操作類
        1 => \FlyCms\WebmanCrontab\event\UrlTask::class,
        2 => \FlyCms\WebmanCrontab\event\EvalTask::class,
        3 => \FlyCms\WebmanCrontab\event\ShellTask::class,
        4 => 'xxx解析類',
        5 => 'xxx解析類',
    ],

任務(wù)解析類你必須實(shí)現(xiàn)下面方法,并且返回code與log字段,code 0 代表成功,1 失敗,log字段必須為string類型

    /**
     * @param $crontab
     * @return array
     */
    public static function parse($crontab){

        return ['log'=> $log, 'code' => $code];
    }

常見錯誤

1 未正確配置redis信息<br>
2 未正確配置端口信息<br>
3 未實(shí)現(xiàn)配置信息里面的 getAllTask ,getTask ,writeRunLog,updateTaskRunState四個方法<br>
4 端口未放行導(dǎo)致無法通訊

效果圖如下
截圖

3439 5 6
5個評論

晚安。

沒有暫停嗎

  • 2548a 2022-10-16

    任務(wù)里不是有個是否啟用字段嗎,關(guān)閉然后調(diào)用重啟就好了

  • 2548a 2022-10-16

    實(shí)際上這里對任務(wù)的任何操作都是你修改數(shù)據(jù)庫后再調(diào)用重啟就好, 因?yàn)橹貑⒍际侵苯又匦伦x取數(shù)據(jù)庫的.

2548a

重復(fù)執(zhí)行bug已修復(fù),導(dǎo)致重復(fù)執(zhí)行bug原因有點(diǎn)復(fù)雜,我盡量表達(dá)清楚些。
該bug出現(xiàn)的原因在于電腦休眠時,在休眠那一刻,假設(shè)某個任務(wù)剛好只有一部分進(jìn)程執(zhí)行到任務(wù)回調(diào)函數(shù),而部分進(jìn)程慢了半拍,還未執(zhí)行電腦就被休眠了.
那么,在重新開啟電腦那一刻,redis任務(wù)鎖由于時間太久已失效,就會產(chǎn)生前面已執(zhí)行完的進(jìn)程觸發(fā)下一次任務(wù),而前面未執(zhí)行到的進(jìn)程繼續(xù)觸發(fā)了上一次的任務(wù).
我自認(rèn)為寫這個代碼時邏輯已經(jīng)很嚴(yán)謹(jǐn)了,但是這種因?yàn)殡娔X休眠而觸發(fā)的bug我也是很無語.....

  • 暫無評論
cbw7172002

反正我是用不起 不曉得咋回事

  • 2548a 2023-04-23

    文檔改了,我重新發(fā)帖子了,不知道是不是因?yàn)橹貜?fù)他把我新發(fā)的刪了,最近太忙也沒注意,我重新編輯下,抱歉了

  • 2548a 2023-04-23

    要不是你回復(fù)我都不知道咋回事

  • 2548a 2023-04-23

    還不行的話你直接聯(lián)系我,這個我創(chuàng)建新項(xiàng)目測試好幾次了的,里面定時任務(wù)我少說也跑了幾十萬次,我q 2548391340

liuqing

請教一下老哥,如果我有個任務(wù)還沒執(zhí)行完,但是任務(wù)時間到了,又開始異步執(zhí)行了,我想在沒執(zhí)行的忽略下一次執(zhí)行,如何操作呢?

  • 兔白白 2024-07-30

    在定時任務(wù)的腳本里面 聲明一個 變量 記錄當(dāng)前任務(wù)的執(zhí)行狀態(tài), 開始執(zhí)行 改成1 執(zhí)行完成改成0 這樣 就能防止重復(fù)執(zhí)行了

  • liuqing 2024-07-30

    嗯嗯.現(xiàn)在用的業(yè)務(wù)鎖插件

liuqing

ErrorException: fwrite(): Send of 70 bytes failed with errno=32 Broken pipe in /app/vendor/yzh52521/webman-task/src/Client.php
請問一下為什么有時候操作會失敗?

  • 暫無評論
年代過于久遠(yuǎn),無法發(fā)表評論

2548a

7124
積分
0
獲贊數(shù)
0
粉絲數(shù)
2021-06-21 加入
??