laravel-addons/command-daemonizer

Laravel/Lumen 控制台命令守护进程,具有优雅的关闭功能

0.1.4 2020-06-13 16:06 UTC

This package is auto-updated.

Last update: 2024-09-14 02:51:52 UTC


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());
        }
    }
}
  1. 你必须实现方法 daemon()。该方法将在一个无限循环中运行。
  2. 你可以在构造函数中注入你的依赖项,或者在 daemon() 方法中注入依赖项。你的依赖项将被解析。
  3. 你可以覆盖空父方法 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)来自动重启守护进程命令。

此库使用缓存来存储重启信号,因此在使用此功能之前,你应该验证缓存驱动程序是否已正确配置。

基于 Illuminate Queue Worker