spatie / laravel-signal-aware-command
在 artisan 命令中处理信号
Requires
- php: ^8.2
- illuminate/contracts: ^11.0
- spatie/laravel-package-tools: ^1.4.3
- symfony/console: ^7.0
Requires (Dev)
- ext-pcntl: *
- brianium/paratest: ^6.2|^7.0
- nunomaduro/collision: ^5.3|^6.0|^7.0|^8.0
- orchestra/testbench: ^9.0
- pestphp/pest-plugin-laravel: ^1.3|^2.0
- phpunit/phpunit: ^9.5|^10|^11
- spatie/laravel-ray: ^1.17
README
使用此包,您可以轻松地在 Laravel 应用中处理 SIGINT
、SIGTERM
等信号。
以下是一个处理 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)。有关更多信息,请参阅 许可文件。