laravel-addons / command-daemonizer
Laravel/Lumen 控制台命令守护进程,具有优雅的关闭功能
0.1.4
2020-06-13 16:06 UTC
Requires
- php: >=7.2.0
- illuminate/console: ^5.0|^6.0|^7.0
- illuminate/support: ^5.0|^6.0|^7.0
Requires (Dev)
- phpunit/phpunit: ^8.5
- roave/security-advisories: dev-master
README
将 Laravel 控制台命令作为长期运行进程运行,并具有优雅的关闭。
安装
composer require laravel-addons/command-daemonizer
Laravel 将自动将服务提供者 CommandDaemonizerServiceProvider
添加到 config/app.php
文件的 providers
选项中。
在 Lumen 中,你必须在 bootstrap/app.php
文件中手动注册服务提供者 CommandDaemonizerServiceProvider
。
$app->register(LaravelAddons\CommandDaemonizer\CommandDaemonizerServiceProvider::class);
如何使用
例如,运行 kafka 消费者
use LaravelAddons\CommandDaemonizer\DaemonCommand; class KafkaMessageConsumer extends DaemonCommand { private $config; private $consumer; protected $signature = 'kafka-consumer'; public function __construct(array $config) { parent::__construct(); $this->config = $config; } protected function init(): void { $this->consumer = ... //initialisation of consumer } public function daemon(MyHandler $handler, LoggerInterface $logger): void { $message = $this->consumer->receive(); try { if ($message instanceof RdKafkaMessage) { $handler->handle($message); $this->consumer->acknowledge($message); } } catch (Throwable $e) { $logger->error($e->getMessage()); } } }
- 你必须实现方法
daemon()
。该方法将在一个无限循环中运行。 - 你可以在构造函数中注入你的依赖项,或者在
daemon()
方法中注入依赖项。你的依赖项将被解析。 - 你可以覆盖空父方法
init()
在守护进程启动前运行一些代码。
选项
DaemonCommand
将一些选项追加到你的命令中
--force : Force the worker to run even in maintenance mode
--memory=128 : The memory limit in megabytes
--sleep=0 : Number of seconds to sleep at each iteration in a loop
--timeout=60 : The number of seconds a child process can run
优雅的关闭
由于守护进程命令是长期运行进程,它们不会在没有重启的情况下接收代码更改。因此,使用守护进程命令部署应用程序的最简单方法是,在部署过程中重启命令。你可以通过发出 daemon-command:restart
命令优雅地重新启动所有守护进程命令。
php artisan daemon-command:restart
此命令将指示所有守护进程命令在完成循环中的当前步骤后优雅地“死亡”。由于守护进程命令将在执行 daemon-command:restart
命令时死亡,因此你应该运行进程管理器(如 Supervisor)来自动重启守护进程命令。
此库使用缓存来存储重启信号,因此在使用此功能之前,你应该验证缓存驱动程序是否已正确配置。