Prevent Multiple Executions of a Console Command

Prevent Multiple Executions of a Console Command

New in version 3.2: The LockableTrait was introduced in Symfony 3.2.

A simple but effective way to prevent multiple executions of the same command in a single server is to use file locks. The Filesystem component provides a LockHandler class that eases the creation and release of these locks.

In addition, the Console component provides a PHP trait called LockableTrait that adds two convenient methods to lock and release commands:

 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;
        }

        // If you prefer to wait until the lock is released, use this:
        // $this->lock(null, true);

        // ...

        // if not released explicitly, Symfony releases the lock
        // automatically when the execution of the command ends
        $this->release();
    }
}

This work, including the code samples, is licensed under a Creative Commons BY-SA 3.0 license.