Сигналы — это механизм межпроцессного взаимодействия, используемый консольными командами. Сигнал — это асинхронное уведомление, отправляемое процессу (или определенному потоку в том же процессе), чтобы уведомить его о произошедшем событии. Например, когда вы нажимаете Ctrl + C
в команде, операционная система отправляет ей сигнал SIGINT
.
В Symfony 5.2 появилась поддержка ответа на сигналы в ваших командах (например, для выполнения некоторых задач очистки при выходе из команды). Если вы хотите обрабатывать некоторые сигналы в команде, реализуйте новый интерфейс SignalableCommandInterface
:
// ...
use Symfony\Component\Console\Command\SignalableCommandInterface;
class SignalCommand extends Command implements SignalableCommandInterface
{
// ...
protected function execute(InputInterface $input, OutputInterface $output): int
{
// ...
}
public function getSubscribedSignals(): array
{
// return here any of the constants defined by PCNTL extension
// https://www.php.net/manual/en/pcntl.constants.php
return [SIGINT, SIGTERM];
}
public function handleSignal(int $signal)
{
if (SIGINT === $signal) {
// ...
}
// ...
}
}
Если вы предпочитаете обрабатывать некоторые сигналы для всех команд приложения (например, для регистрации или профилирования команд), определите слушателя событий или подписчика и прослушайте новое событие ConsoleEvents::SIGNAL
:
// ...
use Symfony\Component\Console\Event\ConsoleSignalEvent;
class SignalSubscriber implements EventSubscriberInterface
{
// ...
public function handleSignal(ConsoleSignalEvent $event)
{
$signal = $event->getHandlingSignal();
// ...
}
public static function getSubscribedEvents()
{
return [
ConsoleEvents::SIGNAL => 'handleSignal',
];
}
}