cheprasov / php-memcached-lock
MemcachedLock for PHP 是一个用于在具有许多执行线程的环境中限制对资源访问的同步机制。锁的设计用于强制执行互斥并发控制策略。
1.0.5
2017-10-08 16:09 UTC
Requires
- php: >=5.5
Requires (Dev)
- cheprasov/php-parallel: 1.0.0
- phpunit/phpunit: 4.8.*
This package is not auto-updated.
Last update: 2024-09-14 17:26:49 UTC
README
MemcachedLock v1.0.5 for PHP >= 5.5
关于
MemcachedLock for PHP 是一个用于在具有许多执行线程的环境中限制对资源访问的同步机制。锁的设计用于强制执行互斥并发控制策略。基于 Memcached。
用法
创建 MemcachedLock 的新实例
<?php require 'vendor/autoload.php'; use MemcachedLock\MemcachedLock; $Memcached = new \Memcached(); $Memcached->addServer('127.0.0.1', '11211'); $Lock = new MemcachedLock( $Memcached, // Instance of Memcached, 'key', // Key in storage, );
锁定过程的用法
<?php require 'vendor/autoload.php'; use MemcachedLock\MemcachedLock; // Create a new Memcached instance $Memcached = new \Memcached(); $Memcached->addServer('127.0.0.1', '11211'); //... /** * Safe update json in Memcached storage * @param Memcached $Memcached * @param string $key * @param array $array * @throws Exception */ function updateJsonInMemcached(\Memcached $Memcached, $key, array $array) { // Create new Lock instance $Lock = new MemcachedLock($Memcached, 'Lock_'.$key, MemcachedLock::FLAG_CATCH_EXCEPTIONS); // Acquire lock for 2 sec. // If lock has acquired in another thread then we will wait 3 second, // until another thread release the lock. Otherwise it throws a exception. if (!$Lock->acquire(2, 3)) { throw new Exception('Can\'t get a Lock'); } // Get value from storage $json = $Memcached->get($key); if (!$json) { $jsonArray = []; } else { $jsonArray = json_decode($json, true); } // Some operations with json $jsonArray = array_merge($jsonArray, $array); $json = json_encode($jsonArray); // Update key in storage $Memcached->set($key, $json); // Release the lock // After $lock->release() another waiting thread (Lock) will be able to update json in storage $Lock->release(); }
方法
MemcachedLock :: __construct ( \Memcached
$Memcached , string
$key [, int
$flags = 0 ] )
创建 MemcachedLock 的新实例。
方法参数
- \Memcached $Memcached - Memcached 实例
- string $key - Memcached 存储中的键名。只有同名锁才会相互竞争锁。
- int $flags, 默认 = 0
MemcachedLock::FLAG_CATCH_EXCEPTIONS
- 如果您不想自己捕获异常,请使用此标志。如果您想对锁定情况有完全控制,则不要使用此标志。默认行为(不使用此标志)- 所有异常都将被抛出。MemcachedLock::FLAG_USE_SELF_EXPIRE_SYNC
- 如果不使用此标志,MemcachedLock 使用 Memcached 来同步锁的过期时间。如果您有多个服务器,它们的时间没有同步,这非常有用。如果锁在单个服务器上工作,建议使用此标志。可以用于多个服务器在多个服务器上严格同步时间。
示例
$Lock = new MemcachedLock($Memcached, 'lockName'); // or $Lock = new MemcachedLock($Memcached, 'lockName', MemcachedLock::FLAG_USE_SELF_EXPIRE_SYNC); // or $Lock = new MemcachedLock($Memcached, 'lockName', MemcachedLock::FLAG_CATCH_EXCEPTIONS | MemcachedLock::FLAG_USE_SELF_EXPIRE_SYNC );
bool
MemcachedLock :: acquire ( int|float
$lockTime , [ float
$waitTime = 0 [, float
$sleep = 0.005 ] ] )
尝试获取 $lockTime
秒的锁。如果锁在另一个线程中被获取,则我们将等待 $waitTime
秒,直到另一个线程释放锁。否则,方法将抛出异常(如果未设置 FLAG_CATCH_EXCEPTIONS
)或返回结果。成功时返回 true
,失败时返回 false
。
方法参数
- int|float $lockTime - 锁的时间(秒)。默认情况下,该值被转换为整数,小数部分向上舍入(
(int) ceil($lockTime)
)。该值必须>= 1
。注意,由于 Memcached 的行为,锁可能获取的时间少于指定的 0.1 到 0.8 秒。否则,如果设置了标志FLAG_USE_SELF_EXPIRE_SYNC
,该值必须>= 0.01
,在这种情况下我们不会有任何时间不准确。 - float $waitTime,默认 = 0 - 等待锁的时间(秒)。如果您不想等待锁释放,请使用
0
。 - float $sleep,默认 = 0.005 - 检查锁可用性的迭代之间的等待时间。
示例
$Lock = new MemcachedLock($Memcached, 'lockName'); $Lock->acquire(3, 4); // ... do something $Lock->release();
bool
MemcachedLock :: update ( int|float
$lockTime )
如果已获取锁,则设置新的锁定时间。成功时返回 true
,失败时返回 false
。方法可能会抛出异常。
方法参数
- int|float $lockTime - 请参阅
MemcachedLock :: acquire
方法的说明
示例
$Lock = new MemcachedLock($Memcached, 'lockName'); $Lock->acquire(3, 4); // ... do something $Lock->update(3); // ... do something $Lock->release();
bool
MemcachedLock :: isAcquired ()
检查此锁是否已获取。成功时返回 true
,失败时返回 false
。
bool
MemcachedLock :: isLocked ()
检查此锁是否已获取且未过期,并且仍然活跃。成功时返回 true
,失败时返回 false
。方法可能会抛出异常。
bool
MemcachedLock :: isExists ()
锁是否存在于任何地方或已被获取?如果锁存在,则返回 true
;如果不存在,则返回 false
。
安装
Composer
下载 composer
wget -nc https://getcomposer.org.cn/composer.phar
并将依赖项添加到您的项目中
php composer.phar require cheprasov/php-memcached-lock
运行测试
要在控制台中运行测试,请输入
./vendor/bin/phpunit ./test/
出现问题
请随意fork项目,修复错误,最后请求pull请求