Новое в Symfony 5.2: Сигналы консоли

Сигналы — это механизм межпроцессного взаимодействия, используемый консольными командами. Сигнал — это асинхронное уведомление, отправляемое процессу (или определенному потоку в том же процессе), чтобы уведомить его о произошедшем событии. Например, когда вы нажимаете 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',
        ];
    }
}