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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// ...
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();
    }
}