Предотвращение многократного выполения консольной команды

Простой, но эффективный способ предотвращения многократного выполнения одной и той же команды на одном сервере заключается в использовании блокировок. Компонент Блокировка предоставляет множество классов для создания замков, основанных на файловой системе (FlockStore), общей памяти (SemaphoreStore) и даже DB и серверах Redis.

В дополнение, компонент Консоль предоставляет PHP-черту под названием LockableTrait, которая добавляет два удобных метода для блокировки и выпуска команд:

// ...
use Symfony\Component\Console\Command\LockableTrait;

class UpdateContentsCommand extends Command
{
    use LockableTrait;

    // ...

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        if (!$this->lock()) {
            $output->writeln('The command is already running in another process.');

            return 0;
        }

        // Если вы предпочитаете дождаться выпуска замка, используйте:
        // $this->lock(null, true);

        // ...

        // если выпуск неясный, Symfony выпускает замок автоматически,
        // когда заканчивается выполнение команды
        $this->release();
    }
}

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.