smskin / laravel-daemon-supervisor
Daemon supervisor engine for laravel projects
Installs: 1 183
Dependents: 1
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
Requires
- php: ^8.1
- ext-pcntl: *
- laravel/framework: ^10 || ^11
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.54
- mockery/mockery: ^1.4
- orchestra/testbench: ^8 || ^9
- phpunit/phpunit: ^10.5
- vimeo/psalm: ^5.4
README
The idea for this library originated from studying the source code of Laravel Horizon.
Horizon starts a master process that spawns child processes to execute tasks from queues.
How It Works
We start a master process (supervisor
), which spawns and manages child processes (worker
).
The master process is subscribed to PCNTL signals. Upon receiving a signal, it first terminates the child processes and then stops itself.
Usage
Master Process (supervisor) - CLI
The artisan command class for the supervisor should extend SMSkin\LaravelSupervisor\Commands\SupervisorsCommand
.
In the class, you need to implement the method protected function getWorkers(): Collection
, which returns a collection of worker process models (classes that implement the SMSkin\LaravelSupervisor\Contracts\IWorker
interface).
You can find an example of an artisan command in ./src/Examples/TestSupervisorCommand.php
.
Worker Process (worker) - CLI
The artisan command class for the worker should extend SMSkin\LaravelSupervisor\Commands\WorkerCommand
.
In the class, you need to implement two methods:
-
public function getSubscribedSignals(): array
- an array of PCNTL signals that this process listens for. -
public function handleSignal(int $signal, false|int $previousExitCode = 0): int|false
- a method called when a PCNTL signal is received. -
You can find an example of an artisan command in
./src/Examples/TestWorkerCommand.php
.
Worker Process Model
The class should implement the SMSkin\LaravelSupervisor\Contracts\IWorker interface
.
In the class, you need to implement the method public function getArtisanCommand(): string
, which returns the artisan command corresponding to the worker process.
You can find an example class in ./src/Examples/TestWorker.php
.