背景介绍公司需要在X分钟内每隔Y秒实现某个接口。Linux自带的crontab好像只能精确到分钟。虽然可以精确到秒,但达不到要求。.选的公司项目都是基于Laravel框架的,所以这不是一个选项。daemon进程的supervisor,看看这家伙能不能满足我们的需求控制台命令的签名。**@varstring*/protected$signature='ue:task{--id=:当前数}{--max=:最大线程}{--sleep=:休眠多少毫秒}{--debug=:调试模式与否}';/***控制台命令说明。**@varstring*/protected$description='命令描述';/***创建一个新的命令实例。**@returnvoid*/publicfunction__construct(){parent::__construct();}/***执行控制台命令。**@returnmixed*/publicfunctionhandle(){$this->id=$this->option('id')??'00';$this->max=$this->option('max')??32;$this->sleep=$this->option('睡眠')??700;$this->debug=$this->option('debug')??错误的;如果($this->id>$this->max){返回真;}while(true){$this->doRun();}}/****@paramint$taskId*@returnboolean*/protectedfunctiondoRun(){$lock=sprintf('task:%03d:%s',$this->id,time());$data=['id'=>$this->id,'max'=>$this->max,'time'=>(newCarbon)->format('Y-m-dH:i:s.u'),'钥匙'=>$锁,];尝试{$result=cache()->get($lock);if($result){$data['message']='任务已执行。';$this->wait($this->sleep);返回真;}缓存()->put($lock,true,2);$data['message']='任务已执行。';$this->logger($data);$这个->等待($this->sleep);}catch(\Exception$ex){$data['message']=$ex->getMessage();缓存()->put($data,true,2);$this->wait($this->sleep);}}/***秒*@paramstring$time*/protectedfunctionwait($time){$wait=$time*1000;睡着了($等待);}protectedfunctionlogger($message){if($this->debug){$time=(newCarbon)->format('Y-m-dH: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/artisanue:task--id=%(process_num)02d--max=8autostart=trueautorestart=trueuser=wwwnumprocs=8redirect_stderr=truestdout_logfile=/home/wwwroot/demo/storage/logs/worker.log上面是supervisor的配置效果图TaskExecuted。-2018-08-1422:17:18.985094任务已执行。-2018-08-1422:17:19.336115任务已执行。-2018-08-1422:17:20.038236任务已执行。-2018-08-1422:17:21.090470任务已执行。-2018-08-1422:17:22.142716任务已执行。-2018-08-1422:17:23.195126任务已执行。-2018-08-1422:17:24.247698任务已执行。-2018-08-1422:17:25.300066任务已执行。-2018-08-1422:17:26.352638任务已执行。-2018-08-1422:17:27.054124任务已执行。-2018-08-1422:17:28.106420任务已执行。-2018-08-1422:17:29.158906任务已执行。-2018-08-1422:17:30.211438任务已执行。-2018-08-1422:17:31.263542任务已执行。-2018-08-1422:17:32.315923任务已执行。-2018-08-1422:17:33.017096任务已执行。-2018-08-1422:17:34.068963任务已执行。-2018-08-1422:17:35.121267任务已执行。-2018-08-1422:17:36.173600任务已执行。-2018-08-1422:17:37.226165输出日志[2018-08-1422:12:24]local.DEBUG:{"id":"1","max":"32","time":“2018-08-1422:12:24.389224”,“关键”:“任务:001:1534255944","message":"TaskExecuted."}[2018-08-1422:12:25]local.DEBUG:{"id":"1","max":"32","time":"2018-08-1422:12:25.390158","key":"task:001:1534255945","message":"TaskExecuted."}[2018-08-1422:12:26]local.DEBUG:{"id":"1","max":"32","time":"2018-08-1422:12:26.391594","key":"task:001:1534255946","message":“任务已执行。”}[2018-08-1422:12:27]local.DEBUG:{“id”:“1”,“max”:“32”,“time”:“2018-08-1422:12:27.393196","key":"task:001:1534255947","message":"TaskExecuted."}[2018-08-1422:12:28]local.DEBUG:{"id":"1","max":"32","time":"2018-08-1422:12:28.395124","key":"task:001:1534255948","message":"任务已执行。"}[2018-08-1422:12:29]local.DEBUG:{"id":"1","max":"32","time":"2018-08-1422:12:29.396796","key":"task:001:1534255949","message":"TaskExecuted."}[2018-08-1422:12:30]local.DEBUG:{"id":"1","max":"32","time":"2018-08-1422:12:30.398666","key":"task:001:1534255950","message":"任务已执行。"}[2018-08-1422:12:31]local.DEBUG:{"id":"1","max":"32","time":"2018-08-1422:12:31.400561","key":"task:001:1534255951","message":“任务已执行。”}[2018-08-1422:12:32]local.DEBUG:{“id”:“1”,“max”:“32”,“time”:“2018-08-1422:12:32.402462","key":"task:001:1534255952","message":"TaskExecuted."}[2018-08-1422:12:33]local.DEBUG:{"id":"1","max":"32","time":"2018-08-1422:12:33.404092","key":"task:001:1534255953","message":"任务已执行。"}[2018-08-1422:12:34]local.DEBUG:{"id":"1","max":"32","time":"2018-08-1422:12:34.405550",“key”:“task:001:1534255954”,“message”:“任务已执行。”}[2018-08-1422:12:35]local.DEBUG:{“id”:“1”,“max”:"32","time":"2018-08-1422:12:35.407197","key":"task:001:1534255955","message":"任务已执行。"}[2018-08-1422:12:36]local.DEBUG:{"id":"1","max":"32","time":"2018-08-1422:12:36.408920","key":"task:001:1534255956","message":"任务已执行。"}[2018-08-1422:12:37]local.DEBUG:{"id":"1","max":"32","时间":"2018-08-1422:12:37.410841","关键":"t问:001:1534255957”,“消息”:“任务已执行。”}[2018-08-1422:12:38]local.DEBUG:{“id”:“1”,“max”:“32”,“时间”:“2018-08-1422:12:38.412764”,“关键”:“任务:001:1534255958”,“消息”:“任务已执行。”}[2018-08-1422:12:39]local.DEBUG:{"id":"1","max":"32","time":"2018-08-1422:12:39.414518","key":"task:001:1534255959",“消息”:“任务已执行。”}[2018-08-1422:12:40]local.DEBUG:{“id”:“1”,“max”:“32”,“time”:“2018-08-1422:12:40.416229","key":"task:001:1534255960","message":"TaskExecuted."}[2018-08-1422:12:41]local.DEBUG:{"id":"1","max":"32","time":"2018-08-1422:12:41.418001","key":"task:001:1534255961","message":"任务已执行。"}[2018-08-1422:12:42]local.DEBUG:{"id":"1","max":"32","time":"2018-08-1422:12:42.419476","key":"task:001:1534255962","message":"TaskExecuted."}[2018-08-1422:12:43]local.DEBUG:{"id":"1","max":"32","time":"2018-08-1422:12:43.421388","key":"task:001:1534255963","message":"任务已执行。"}[2018-08-1422:12:44]local.DEBUG:{"id":"1","max":"32","time":"2018-08-1422:12:44.423164","key":"task:001:1534255964","message":"TaskExecuted."}[2018-08-1422:12:45]local.DEBUG:{"id":"1","max":"32","time":"2018-08-1422:12:45.424798","key":"task:001:1534255965","message":"TaskExecuted."}[2018-08-1422:12:46]local.DEBUG:{"id":"1","max":"32","time":"2018-08-1422:12:46.426667","key":"task:001:1534255966","message":“任务已执行。”}[2018-08-1422:12:47]local.DEBUG:{“id”:“1”,“max”:“32”,“time”:“2018-08-1422:12:47.428553","key":"task:001:1534255967","message":"TaskExecuted."}[2018-08-1422:12:48]local.DEBUG:{"id":"1","max":"32","time":"2018-08-1422:12:48.430427","key":"task:001:1534255968","message":"任务已执行。"}[2018-08-1422:12:49]local.DEBUG:{"id":"1","max":"32","time":"2018-08-1422:12:49.432118",“key”:“task:001:1534255969”,“message”:“任务已执行。”}[2018-08-1422:12:50]local.DEBUG:{“id”:“1”,“max”:"32","时间":"2018-08-1422:12:50.433893","key":"task:001:1534255970","message":"TaskExecuted."}[2018-08-1422:12:51]local.DEBUG:{"id":"1""max":"32","time":"2018-08-1422:12:51.435711","key":"task:001:1534255971","message":"任务已执行。"}[2018-08-1422:12:52]local.DEBUG:{"id":"1","max":"32","time":"2018-08-1422:12:52.437015","key":"task:001:1534255972","message":"TaskExecuted."}[2018-08-1422:12:53]local.DEBUG:{"id":"1","max":"32","time":"2018-08-1422:12:53.438352","key":"task:001:1534255973","message":"任务已执行。"}[2018-08-1422:12:54]local.DEBUG:{"id":"1","max":"32","time":"2018-08-1422:12:54.439989","key":"task:001:1534255974","message":"TaskExecuted."}[2018-08-1422:12:55]local.DEBUG:{"id":"1","max":"32","time":"2018-08-1422:12:55.441580","key":"task:001:1534255975","message":"TaskExecuted."}[2018-08-1422:12:56]本地。调试:{"id":"1","max":"32","time":"2018-08-1422:12:56.443116","key":"task:001:1534255976","message":"任务已执行。"}[2018-08-1422:12:57]local.DEBUG:{"id":"1","max":"32","time":"2018-08-1422:12:57.445006","key":"task:001:1534255977","message":"TaskExecuted."}
