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

New in version 3.2: LockableTrait был представлен в Symfony 3.2.

Простой, но эффективный способ предотвращения многократного выполнения одной и той же команды на одном сервере заключается в использовании файловых замков. Компонент Файловой системы предоставляет класс LockHandler, который облегчает создание и выпуск таких замков.

В дополнение, компонент Консоль предоставляет 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(true);

        // ...

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

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