Integrates zerkalica/semaphore library into Symfony2.
A generic locking Symfony bundle for PHP, that uses named locks for semaphore acquire and release, to guarantee atomicity.
Locking is useful for controlling access to resources in a multi-process or distributed environment.
The idea is that the actual locking mechanism can be implemented in any way you like, in order to fit your technology stack.
Page bundle: https://github.com/Avtonom/semaphore-bundle
Maybe in the future:
Run the following in your project root, assuming you have composer set up for your project
composer.phar require avtonom/semaphore-bundle ^1.4
composer require snc/redis-bundle
Switching ^1.4 for the most recent tag.
Add the bundle to app/AppKernel.php
$bundles(
...
new Avtonom\SemaphoreBundle\AvtonomSemaphoreBundle(),
new Snc\RedisBundle\SncRedisBundle(),
...
);
Configuration options (config.yaml):
snc_redis:
clients:
semaphore:
type: predis
alias: semaphore
dsn: redis://localhost/2
avtonom_semaphore:
adapter_redis_client: snc_redis.semaphore
key_storage_class: Application\Avtonom\SemaphoreBundle\SemaphoreKeyStorage
#mode: demo # activation of the demo mode - keeping all logging but does not execute set and validates the key.
# default
# adapter: avtonom_semaphore.adapter.redis
# manager_class: Avtonom\SemaphoreBundle\Model\SemaphoreManager
# is_exception_repeat_block_key: true # Generate an error when you try to re-key block in the same process.
# use_extended_methods: true
Configuration options (parameters.yaml):
parameters:
# default
# avtonom_semaphore.try_count: 240 # try count, if lock not acquired. 240 count * 1/2 sec (sleep wait) = 120 sec wait
# avtonom_semaphore.sleep_time: 500000 # sleep time in microseconds, if lock not acquired. 1.000.000 microseconds = 1 seconds
# avtonom_semaphore.max_lock_time: 60 # ttl - max lock time
# avtonom_semaphore.prefix: 'lock_'
use Avtonom\SemaphoreBundle\Traits\SemaphoreTrait\SemaphoreTrait;
// or
/** @var $semaphore \Avtonom\Semaphore\Model\SemaphoreManagerInterface */
$semaphore = $container->get('avtonom_semaphore.manager');
$lockKeyStorage = $this->getLockKeyStorage();
$lockKey = [$lockKeyStorage::MY_KEY, $param1, $param2, $paramN];
$this->lockAcquire($lockKey, __METHOD__, 10 /* 10 - if you personal lock expire time in seconds. default 60 */);
// Do something thread-safe
$this->lockRelease($lockKey, __METHOD__);
Create Application\Avtonom\SemaphoreBundle\KeyStorage class:
<?php
namespace Application\Avtonom\SemaphoreBundle;
use Avtonom\SemaphoreBundle\Model\SemaphoreKeyStorageInterface;
class SemaphoreKeyStorage implements SemaphoreKeyStorageInterface
{
const
MY_KEY = 'M_K_',
MY_OTHER_KEY = 'M_O_K_'
;
}
How can I help you explore Laravel packages today?