Symfony Console component is a powerful tool for building command line applications in PHP. However, there are scenarios where you want to ensure that a particular console command is not executed multiple times concurrently. This is especially crucial in scenarios where a command performs critical operations or alters the state of the application. This tutorial shows how to prevent to run console command multiple times in Symfony 7.
Symfony provides a Lock component that can be utilized to prevent concurrent execution of commands. The Console component provides a PHP trait called LockableTrait
which is based on the Lock component.
By acquiring a lock before the command starts and releasing it when the command finishes, we can ensure that only one instance of the command is running at a time.
<?php
namespace App\Command;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Command\LockableTrait;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
#[AsCommand(name: 'app:test')]
class TestCommand extends Command
{
use LockableTrait;
protected function execute(InputInterface $input, OutputInterface $output): int
{
if (!$this->lock()) {
$output->writeln('The command is already running within a different process.');
return Command::SUCCESS;
}
sleep(5);
$output->writeln('Long-running task done.');
return Command::SUCCESS;
}
}
Please be aware that Symfony automatically releases the lock upon completion of the command execution.
Leave a Comment
Cancel reply