spatie/laravel-signal-aware-command

在 artisan 命令中处理信号

2.0.0 2024-02-05 13:37 UTC

This package is auto-updated.

Last update: 2024-09-05 14:53:25 UTC


README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

使用此包,您可以轻松地在 Laravel 应用中处理 SIGINTSIGTERM 等信号。

以下是一个处理 SIGINT 信号的快速示例。

use Spatie\SignalAwareCommand\SignalAwareCommand;

class YourCommand extends SignalAwareCommand
{
    protected $signature = 'your-command';

    public function handle()
    {
        $this->info('Command started...');

        sleep(100);
    }

    public function onSigint()
    {
        // will be executed when you stop the command
    
        $this->info('You stopped the command!');
    }
}

支持我们

我们在创建 一流的开放源代码包 上投入了大量的资源。您可以通过 购买我们的付费产品之一 来支持我们。

我们非常感谢您从家乡寄给我们明信片,注明您正在使用我们哪些包。您可以在 我们的联系页面 上找到我们的地址。我们将在 我们的虚拟明信片墙 上发布所有收到的明信片。

安装

您可以通过 composer 安装此包

composer require spatie/laravel-signal-aware-command

使用

为了使 artisan 命令能够处理信号,您需要让它扩展 SignalAwareCommand

use Spatie\SignalAwareCommand\SignalAwareCommand;

class YourCommand extends SignalAwareCommand
{
    // your code
}

处理信号

有三种处理信号的方式

  • 在命令本身
  • 通过 Signal 门面
  • 使用 SignalReceived 事件

在命令上

要在命令本身处理信号,您需要让您的命令扩展 SignalAwareCommand。接下来,定义一个以 on 开头后跟信号名称的方法。以下是一个处理 SIGINT 信号的示例。

use Spatie\SignalAwareCommand\SignalAwareCommand;

class YourCommand extends SignalAwareCommand
{
    protected $signature = 'your-command';

    public function handle()
    {
        $this->info('Command started...');

        sleep(100);
    }

    public function onSigint()
    {
        // will be executed when you stop the command
    
        $this->info('You stopped the command!');
    }
}

通过 Signal 门面

使用 Signal 门面,您可以在应用程序的任何位置注册信号处理代码。

首先,您需要在命令的 handlesSignals 属性中定义您想要处理的信号。

use Spatie\SignalAwareCommand\SignalAwareCommand;

class YourCommand extends SignalAwareCommand
{
    protected $signature = 'your-command';
    
    protected $handlesSignals = [SIGINT];

    public function handle()
    {
        (new SomeOtherClass())->performSomeWork();

        sleep(100);
    }
}

在您喜欢的任何类中,您可以使用 Signal 门面注册在收到信号时应执行的代码。

use Illuminate\Console\Command;
use Spatie\SignalAwareCommand\Facades\Signal;

class SomeOtherClass
{
    public function performSomeWork()
    {
        Signal::handle(SIGINT, function(Command $commandThatReceivedSignal) {
            $commandThatReceivedSignal->info('Received the SIGINT signal!');
        })
    }
}

如果您想要移除之前已注册的处理程序,可以调用 clearHandlers

use Spatie\SignalAwareCommand\Facades\Signal;

public function performSomeWork()
{
    Signal::handle(SIGNINT, function() {
        // perform cleanup
    });
    
    $this->doSomeWork();
    
    // at this point doSomeWork was executed without any problems
    // running a cleanup isn't necessary anymore
    Signal::clearHandlers(SIGINT);
}

要清除所有信号的所有处理程序,请使用 Signal::clearHandlers()

使用 SignalReceived 事件

每当收到信号时,都会触发 Spatie\SignalAwareCommand\Events\SignalReceived 事件。

为了注册您想要接收的事件,您必须在您的命令中定义一个 handlesSignals 属性。以下是一个注册监听 SIGINT 信号的示例。

use Spatie\SignalAwareCommand\SignalAwareCommand

class YourCommand extends SignalAwareCommand
{
    protected $signature = 'your-command';
    
    protected $handlesSignals = [SIGINT];

    public function handle()
    {
        (new SomeOtherClass())->performSomeWork();

        sleep(100);
    }
}

在您喜欢的任何类中,您都可以监听 SignalReceived 事件。

use Spatie\SignalAwareCommand\Events\SignalReceived;
use Spatie\SignalAwareCommand\Signals;

class SomeOtherClass
{
    public function performSomeWork()
    {
        Event::listen(function(SignalReceived $event) {
            $signalNumber = $event->signal;
            
            $signalName = Signals::getSignalName($signalNumber);
        
            $event->command->info("Received the {$signalName} signal");
        });
    }
}

了解此包是如何构建的

此包的基础代码是在 YouTube 上的这个直播 中编写的。

测试

composer test

变更日志

有关最近更改的更多信息,请参阅 变更日志

贡献

有关详细信息,请参阅 贡献

安全漏洞

请审查 我们的安全策略 以了解如何报告安全漏洞。

鸣谢

许可

MIT 许可证 (MIT)。有关更多信息,请参阅 许可文件