基于Laravel框架下使用守护进程supervisor实现定时任务(毫秒)
Aug 16, 2018 am 10:14 AM
laravel
php
redis
supervisor
本篇文章给大家带来的内容是关于基于Laravel框架下使用守护进程supervisor实现定时任务(毫秒),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
公司需要实现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); } }
Salin selepas log masuk
进程守护
[program:task-worker] process_name=%(program_name)s_%(process_num)02d command=/usr/bin/php /home/wwwroot/demo/artisan ue:task --id=%(process_num)02d --max=8 autostart=true autorestart=true user=www numprocs=8 redirect_stderr=true stdout_logfile=/home/wwwroot/demo/storage/logs/worker.log
Salin selepas log masuk
上面是supervisor的配置
效果图
Task Executed. - 2018-08-14 22:17:18.985094 Task Executed. - 2018-08-14 22:17:19.336115 Task Executed. - 2018-08-14 22:17:20.038236 Task Executed. - 2018-08-14 22:17:21.090470 Task Executed. - 2018-08-14 22:17:22.142716 Task Executed. - 2018-08-14 22:17:23.195126 Task Executed. - 2018-08-14 22:17:24.247698 Task Executed. - 2018-08-14 22:17:25.300066 Task Executed. - 2018-08-14 22:17:26.352638 Task Executed. - 2018-08-14 22:17:27.054124 Task Executed. - 2018-08-14 22:17:28.106420 Task Executed. - 2018-08-14 22:17:29.158906 Task Executed. - 2018-08-14 22:17:30.211438 Task Executed. - 2018-08-14 22:17:31.263542 Task Executed. - 2018-08-14 22:17:32.315923 Task Executed. - 2018-08-14 22:17:33.017096 Task Executed. - 2018-08-14 22:17:34.068963 Task Executed. - 2018-08-14 22:17:35.121267 Task Executed. - 2018-08-14 22:17:36.173600 Task Executed. - 2018-08-14 22:17:37.226165
Salin selepas log masuk
输出日志
[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."}
Salin selepas log masuk
相关推荐:
用PHP实现守护进程任务后台运行与多线程(php-resque使用说明)
Atas ialah kandungan terperinci 基于Laravel框架下使用守护进程supervisor实现定时任务(毫秒). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Artikel Panas
Berapa lama masa yang diperlukan untuk mengalahkan fiksyen berpecah?
3 minggu yang lalu
By DDD
Repo: Cara menghidupkan semula rakan sepasukan
3 minggu yang lalu
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
3 minggu yang lalu
By 尊渡假赌尊渡假赌尊渡假赌
Kesukaran mengemas kini caching laman web akaun rasmi: Bagaimana untuk mengelakkan cache lama yang mempengaruhi pengalaman pengguna selepas kemas kini versi?
3 minggu yang lalu
By 王林
R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 minggu yang lalu
By 尊渡假赌尊渡假赌尊渡假赌

Alat panas Tag

Artikel Panas
Berapa lama masa yang diperlukan untuk mengalahkan fiksyen berpecah?
3 minggu yang lalu
By DDD
Repo: Cara menghidupkan semula rakan sepasukan
3 minggu yang lalu
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
3 minggu yang lalu
By 尊渡假赌尊渡假赌尊渡假赌
Kesukaran mengemas kini caching laman web akaun rasmi: Bagaimana untuk mengelakkan cache lama yang mempengaruhi pengalaman pengguna selepas kemas kini versi?
3 minggu yang lalu
By 王林
R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 minggu yang lalu
By 尊渡假赌尊渡假赌尊渡假赌

Tag artikel panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian

Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP
