avtonom/semaphore-bundle

一个通用的PHP锁Symfony扩展包,使用命名锁来获取和释放信号量,以保证原子性

安装数: 2,762

依赖者: 0

建议者: 0

安全性: 0

星标: 11

关注者: 2

分支: 3

开放问题: 1

类型:symfony-bundle

v1.4.1 2020-10-09 08:13 UTC

This package is auto-updated.

Last update: 2024-09-09 21:15:21 UTC


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

需要帮助?

  1. 请查看日志文件 %kernel.logs_dir%/%kernel.environment%.semaphore.log
  2. 如果您发现了一个错误,请创建一个问题,