CommandLockingBundle
, (*1)
Sometimes you want to ensure that a Symfony console command does not run in parallel.
This bundle adds an optional locking feature to all console commands that can be used to prevent parallel execution., (*2)
Installation
Install the bundle via Composer:, (*3)
composer require matthimatiker/command-locking-bundle
Then register the bundle in your AppKernel:, (*4)
<?php
// app/AppKernel.php
public function registerBundles()
{
$bundles = array(
// ...
new \Matthimatiker\CommandLockingBundle\MatthimatikerCommandLockingBundle()
);
// ...
}
Usage
Simply pass the --lock option to any command to ensure that parallel runs are prohibited:, (*5)
app/console cache:warmup --lock
If the command did not terminate yet and the same command is called again (in lock mode), then
it is simply skipped and a notice is shown., (*6)
The default locking implementation relies on the filesystem and uses Symfony's
LockHandler.
This avoids parallel execution as long as your application runs on a single system.
If you need a distributed lock, then you will have to write your own lock manager., (*7)
Custom Lock Managers
A custom lock manager must implement \Matthimatiker\CommandLockingBundle\Locking\LockManagerInterface.
Afterwards it must be registered as service and tagged as matthimatiker_command_locking.console.lock_manager:, (*8)
my.custom_lock_manager:
class: My\Custom\LockManager
tags:
- { name: matthimatiker_command_locking.console.lock_manager, alias: custom }
An alias must be defined together with the tag (custom in this example) and is used to reference
the new lock manager:, (*9)
app/console cache:warmup --lock=custom
Known Issues
When sub-command are called as described in the official documentation,
then locking cannot be used for the sub-commands as the life-cycle events are not fired., (*10)