博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于supervisor秒级Laravel定时任务
阅读量:5324 次
发布时间:2019-06-14

本文共 8891 字,大约阅读时间需要 29 分钟。

背景介绍

公司需要实现X分钟内每隔Y秒轮训某个接口,Linux自带的crontab貌似只精确到分钟,虽然可以到精确到秒,但是并不满足需求。

选型

公司项目都是 基于 Laravel 框架,所以这个没得选。守护进程用的 supervisor,看看这个家伙能不能满足我们的需求

代码

namespace App\Console\Commands;use Illuminate\Console\Command;use Cache;use Carbon\Carbon;class TaskCommand extends Command {    /**     * The name and signature of the console command.     *     * @var string     */    protected $signature = 'ue:task        {--id=      : 当前编号}        {--max=     : 最大线程}        {--sleep=   : 休眠多少毫秒}        {--debug=   : 是否调试模式}        ';    /**     * The console command description.     *     * @var string     */    protected $description = 'Command description';    /**     * Create a new command instance.     *     * @return void     */    public function __construct() {        parent::__construct();    }    /**     * Execute the console command.     *     * @return mixed     */    public function handle() {        $this->id       = $this->option('id') ?? '00';        $this->max      = $this->option('max') ?? 32;        $this->sleep    = $this->option('sleep') ?? 700;        $this->debug    = $this->option('debug') ?? false;        if ($this->id > $this->max) {            return true;        }        while (true) {            $this->doRun();        }    }    /**     *      * @param int $taskId     * @return boolean     */    protected function doRun() {        $lock = sprintf('task:%03d:%s', $this->id, time());        $data = [            'id' => $this->id,            'max' => $this->max,            'time'  => (new Carbon)->format('Y-m-d H:i:s.u'),            'key' => $lock,        ];        try {            $result = cache()->get($lock);            if ($result) {                $data['message'] = 'Task Has been executed.';                $this->wait($this->sleep);                return true;            }            cache()->put($lock, true, 2);            $data['message'] = 'Task Executed.';            $this->logger($data);            $this->wait($this->sleep);        } catch (\Exception $ex) {            $data['message'] = $ex->getMessage();            cache()->put($data, true, 2);            $this->wait($this->sleep);        }    }    /**     * 毫秒     * @param string $time     */    protected function wait($time) {        $wait = $time * 1000;        usleep($wait);    }    protected function logger($message) {        if($this->debug){            $time   = (new Carbon)->format('Y-m-d H:i:s.u');            $this->line(array_get($message, 'message') .' - '. $time);        }        logger()->stack(['task'])->debug(null, $message);    }}

进程守护

[program:task-worker]process_name=%(program_name)s_%(process_num)02dcommand=/usr/bin/php /home/wwwroot/demo/artisan ue:task --id=%(process_num)02d --max=8autostart=trueautorestart=trueuser=wwwnumprocs=8redirect_stderr=truestdout_logfile=/home/wwwroot/demo/storage/logs/worker.log
上面是supervisor的配置

效果图

Task Executed. - 2018-08-14 22:17:18.985094Task Executed. - 2018-08-14 22:17:19.336115Task Executed. - 2018-08-14 22:17:20.038236Task Executed. - 2018-08-14 22:17:21.090470Task Executed. - 2018-08-14 22:17:22.142716Task Executed. - 2018-08-14 22:17:23.195126Task Executed. - 2018-08-14 22:17:24.247698Task Executed. - 2018-08-14 22:17:25.300066Task Executed. - 2018-08-14 22:17:26.352638Task Executed. - 2018-08-14 22:17:27.054124Task Executed. - 2018-08-14 22:17:28.106420Task Executed. - 2018-08-14 22:17:29.158906Task Executed. - 2018-08-14 22:17:30.211438Task Executed. - 2018-08-14 22:17:31.263542Task Executed. - 2018-08-14 22:17:32.315923Task Executed. - 2018-08-14 22:17:33.017096Task Executed. - 2018-08-14 22:17:34.068963Task Executed. - 2018-08-14 22:17:35.121267Task Executed. - 2018-08-14 22:17:36.173600Task Executed. - 2018-08-14 22:17:37.226165

输出日志

[2018-08-14 22:12:24] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:24.389224","key":"task:001:1534255944","message":"Task Executed."} [2018-08-14 22:12:25] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:25.390158","key":"task:001:1534255945","message":"Task Executed."} [2018-08-14 22:12:26] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:26.391594","key":"task:001:1534255946","message":"Task Executed."} [2018-08-14 22:12:27] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:27.393196","key":"task:001:1534255947","message":"Task Executed."} [2018-08-14 22:12:28] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:28.395124","key":"task:001:1534255948","message":"Task Executed."} [2018-08-14 22:12:29] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:29.396796","key":"task:001:1534255949","message":"Task Executed."} [2018-08-14 22:12:30] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:30.398666","key":"task:001:1534255950","message":"Task Executed."} [2018-08-14 22:12:31] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:31.400561","key":"task:001:1534255951","message":"Task Executed."} [2018-08-14 22:12:32] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:32.402462","key":"task:001:1534255952","message":"Task Executed."} [2018-08-14 22:12:33] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:33.404092","key":"task:001:1534255953","message":"Task Executed."} [2018-08-14 22:12:34] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:34.405550","key":"task:001:1534255954","message":"Task Executed."} [2018-08-14 22:12:35] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:35.407197","key":"task:001:1534255955","message":"Task Executed."} [2018-08-14 22:12:36] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:36.408920","key":"task:001:1534255956","message":"Task Executed."} [2018-08-14 22:12:37] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:37.410841","key":"task:001:1534255957","message":"Task Executed."} [2018-08-14 22:12:38] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:38.412764","key":"task:001:1534255958","message":"Task Executed."} [2018-08-14 22:12:39] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:39.414518","key":"task:001:1534255959","message":"Task Executed."} [2018-08-14 22:12:40] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:40.416229","key":"task:001:1534255960","message":"Task Executed."} [2018-08-14 22:12:41] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:41.418001","key":"task:001:1534255961","message":"Task Executed."} [2018-08-14 22:12:42] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:42.419476","key":"task:001:1534255962","message":"Task Executed."} [2018-08-14 22:12:43] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:43.421388","key":"task:001:1534255963","message":"Task Executed."} [2018-08-14 22:12:44] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:44.423164","key":"task:001:1534255964","message":"Task Executed."} [2018-08-14 22:12:45] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:45.424798","key":"task:001:1534255965","message":"Task Executed."} [2018-08-14 22:12:46] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:46.426667","key":"task:001:1534255966","message":"Task Executed."} [2018-08-14 22:12:47] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:47.428553","key":"task:001:1534255967","message":"Task Executed."} [2018-08-14 22:12:48] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:48.430427","key":"task:001:1534255968","message":"Task Executed."} [2018-08-14 22:12:49] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:49.432118","key":"task:001:1534255969","message":"Task Executed."} [2018-08-14 22:12:50] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:50.433893","key":"task:001:1534255970","message":"Task Executed."} [2018-08-14 22:12:51] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:51.435711","key":"task:001:1534255971","message":"Task Executed."} [2018-08-14 22:12:52] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:52.437015","key":"task:001:1534255972","message":"Task Executed."} [2018-08-14 22:12:53] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:53.438352","key":"task:001:1534255973","message":"Task Executed."} [2018-08-14 22:12:54] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:54.439989","key":"task:001:1534255974","message":"Task Executed."} [2018-08-14 22:12:55] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:55.441580","key":"task:001:1534255975","message":"Task Executed."} [2018-08-14 22:12:56] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:56.443116","key":"task:001:1534255976","message":"Task Executed."} [2018-08-14 22:12:57] local.DEBUG:  {"id":"1","max":"32","time":"2018-08-14 22:12:57.445006","key":"task:001:1534255977","message":"Task Executed."}

原文地址:https://segmentfault.com/a/1190000016012148

转载于:https://www.cnblogs.com/lalalagq/p/9974998.html

你可能感兴趣的文章
洛谷 P3371 【模板】单源最短路径(弱化版) && dijkstra模板
查看>>
洛谷 P1082 同余方程(同余&&exgcd)
查看>>
洛谷 P5020 货币系统
查看>>
洛谷 P1077 摆花
查看>>
洛谷 P5019 铺设道路(差分)
查看>>
洛谷 P3865 【模板】ST表
查看>>
洛谷 P1025 数的划分
查看>>
洛谷 P1057 传球游戏
查看>>
洛谷 P1091 合唱队形
查看>>
洛谷 CF804B Minimum number of steps
查看>>
洛谷 P1197 [JSOI2008]星球大战
查看>>
洛谷 CF798C Mike and gcd problem
查看>>
洛谷 P2672 推销员
查看>>
洛谷 P1631 序列合并
查看>>
洛谷 P5057 [CQOI2006]简单题(树状数组)
查看>>
19年SD夏令营游记
查看>>
洛谷 P1886 滑动窗口(单调队列)
查看>>
洛谷 P1241 括号序列(栈)
查看>>
递归练习
查看>>
洛谷 P1168 中位数(优先队列)
查看>>