avtonom / semaphore-bundle
一个通用的PHP锁Symfony扩展包,使用命名锁来获取和释放信号量,以保证原子性
v1.4.1
2020-10-09 08:13 UTC
Requires
- php: >=5.3.2
- symfony/dependency-injection: >=2.3.0
- symfony/monolog-bundle: >=2.0.7
- zerkalica/semaphore: ~1.0
README
将zerkalica/semaphore库集成到Symfony2中。
一个通用的PHP锁Symfony扩展包,使用命名锁来获取和释放信号量,以保证原子性。
锁定对于控制多进程或分布式环境中的资源访问非常有用。
实际锁定机制可以根据您喜欢的任何方式进行实现,以适应您的技术堆栈。
页面包: https://github.com/Avtonom/semaphore-bundle
支持适配器
- redis
- memcached
- sem (本地功能)
- apc
- flock (文件系统)
-
- doctrine/orm , pdo, sql - (未来版本)
特性
- 检查尝试锁定同一进程。这种反应有两种变体:抛出异常或扩展键的生命周期。
- 在移除键之前检查是否是此进程设置的。需要确认键在时间没有死亡,并且没有其他进程设置。
- 通知脚本完成并忘记删除锁。
- 在monolog的特定通道上记录所有必要信息(通道:semaphore)的操作。
- 选择锁管理器的类(SemaphoreManager)
- 选择包含键锁列表的对象类(KeyStorage)
- 演示模式 - 保持所有记录但不会执行设置和验证键。
- 设置参数,例如
-
- 获取锁的尝试次数
-
- 获取锁尝试之间的等待时间
-
- 锁的生命周期
-
- 键锁前缀
可能在将来
- 注意,在键寿命期间锁已死亡
- 适配器for doctrine/orm, pdo, sql
- 锁和日志管理操作的行政界面(Sonata项目)列表
- 在symfony调试工具栏的时间轴中查看信号量使用情况
安装
在项目根目录中运行以下命令,假设您已为项目设置了composer
composer.phar require avtonom/semaphore-bundle ^1.4 composer require snc/redis-bundle
切换到最新标签 ^1.4
。
将包添加到app/AppKernel.php
$bundles( ... new Avtonom\SemaphoreBundle\AvtonomSemaphoreBundle(), new Snc\RedisBundle\SncRedisBundle(), ... );
配置选项(config.yaml)
snc_redis: clients: semaphore: type: predis alias: semaphore dsn: redis:///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
配置选项(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__);
创建Application\Avtonom\SemaphoreBundle\KeyStorage类
<?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_' ; }
需要帮助?
- 请查看日志文件 %kernel.logs_dir%/%kernel.environment%.semaphore.log
- 如果您发现了一个错误,请创建一个问题,