innmind/signals

每个信号管理多个回调

3.1.0 2023-09-23 12:21 UTC

This package is auto-updated.

Last update: 2024-09-23 14:44:23 UTC


README

Build Status codecov Type Coverage

pcntl_signal 之上的小抽象,允许为单个信号注册多个可调用对象。

安装

composer require innmind/signals

使用方法

use Innmind\Signals\{
    Handler,
    Signal,
    Info,
};

$handler = new Handler; // automatically enable async signal at instanciation

$handler->listen(Signal::interrupt, function(Signal $signal, Info $info): void {
    echo 'foo';
});
$handler->listen(Signal::interrupt, function(Signal $signal, Info $info): void {
    echo 'bar';
});

// do some logic here

当以上脚本在终端中执行,并且你使用 ctrl + c 来停止进程时,它会打印 foobar 而不是停止脚本。

重要:当在程序中使用 pcntl_fork 时,请记住在子进程中通过 $handler->reset() 重置处理程序,以避免两个进程调用监听器。一旦重置,处理程序就不再可用,你需要构建一个新实例。

如果出于某种原因需要删除处理程序(例如子进程结束),你可以调用 $handler->remove($listener)(移除所有信号的处理程序监听器)。