Small abstraction on top of pcntl_signal to allow to register multiple callables for a single signal.
composer require innmind/signalsuse Innmind\Signals\{
Handler,
Signal,
Info,
};
$handler = Handler::main(); // automatically enable async signal on first `->listen()` call
$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 hereWhen above script is executed in a terminal and you do a ctrl + c to stop the process it will print foobar instead of stopping the script.
If for some reason you need to remove a handler (for example when a child process ended) you can call $handler->remove($listener) (remove the listener for all signals).