关于 HorizonHorizon 是 Laravel 作者对框架 Queue 的一个补充包,提供了友好的 UI 界面和 Supervisor 进程管理启动`php artisan horizon`完
关于 Horizon
Horizon
是 Laravel
作者对框架 Queue
的一个补充包,提供了友好的 UI
界面和 Supervisor
进程管理
启动
`php artisan horizon`
完整结构
Horizon 在 Redis 中的完整结构 , 后面解释字段含义。
源码解析
开始进入源码部分了,请坐稳扶好, 这是我们启动 Horizon 的时候触发的代码,标注了 6 处待分析的地方
public function handle(MasterSupervisorRepository $masters){ if ($masters->find(MasterSupervisor::name())) { return $this->comment('A master supervisor is already running on this machine.'); } 1️⃣ $master = (new MasterSupervisor)->handleOutputUsing(function ($type, $line) { $this->output->write($line); }); 2️⃣ ProvisioningPlan::get(MasterSupervisor::name())->deploy( $this->option('environment') ?? config('horizon.env') ?? config('app.env') ); 3️⃣ $this->info('Horizon started successfully.'); pcntl_async_signals(true); 4️⃣ pcntl_signal(SIGINT, function () use ($master) { $this->line('Shutting down...'); return $master->terminate(); }); 5️⃣ $master->monitor(); 6️⃣}
6 块代码分析
- 1️⃣ 这里就是生成一个
gethostname() + Str::random(4)
的Master
进程名称,如果不幸产生了同名的进程,那么直接返回一个错误提醒~
2️⃣初始化
MasterSupervisor
对象$this->name
在第一步就已经生成了静态的名字了$this->supervisors
可以看出给了一个集合,一看就是要支持多个进程的样子$this->output
第二步就是让output
属性能拥有输出到缓冲区的能力最后一步是刷新,刷新高清大图中的
horizon:master:gethostname()+Str::random(4)
这个进程名称关于这个
flush
方法干了啥大家一定很好奇$this->connection()->del('commands:'.$name);
这就是它做的事情,去
Redis
删除这个 key。
3️⃣过了四级的我翻译了一下:
创建一个资源分配计划!
这个就是
Horizon
的配置文件,里面的processes
进程数,balance
进程分配策略等等各项参数就是通过这个
ProvisioningPlan
类解析的内容。
