iainp999 / lockman
锁定操作处理器
Requires (Dev)
- phpunit/phpunit: 3.7.*
- satooshi/php-coveralls: dev-master
This package is auto-updated.
Last update: 2024-09-18 17:53:04 UTC
README
一个使用命名锁的PHP通用锁定库。
锁定在多进程或分布式环境中控制对资源的访问时非常有用。
实际锁定机制可以按照您的喜好以任何方式实现,以适应您的技术堆栈。您只需要为特定技术实现 LockHandlerInterface
(为本地文件系统和Drupal锁定API提供了示例锁定处理器)。
您可能有一些涉及多个进程和共享资源的离线处理,其中需要关于资源独占访问的保证。在这种情况下,您可能希望考虑使用此类库,使用适当的 LockHandlerInterface
实现。
请参阅 lib/LockMan/Handler
中 LockHandlerInterface
实现的示例。
示例用法
在这种情况下,我们假设有一个名为 LockHandler
的类实现了 LockHandlerInterface
。
通用
注意。在实际中,我建议使用可配置的服务/DI容器来创建对象。
$lockHandler = new LockHandler();
$lockable = new MyLockable();
if ($lockHandler->lock($lockable)) {
// Some critical section code.
}
...
锁定操作
您不必使用这个类,它只是为了方便在执行前需要获取锁的操作而提供的。操作完成后会释放锁;如果发生异常,则会在重新抛出异常之前释放锁。任何PHP可调用项都可以是操作。
当前实现不支持在执行前获取多个锁。这可能在未来的版本中得到支持。
以下是一个假设的示例,您可以在服务容器中构建许多这些对象(在示例中“假设”是因为您可能不会像这样直接创建所有这些对象)。
$lockHandler = new LockHandler();
$lockedOperation = new LockedOperation($lockHandler);
$lockable = new MyLockable();
$myOperation = array('SomeClass', 'someMethod');
// Execute the locked operation.
try {
$lockedOperation->execute($myOperation, $lockable);
}
catch (Exception $ex) {
// handle exception.
}
这里需要注意的一个重要事项是,一旦创建,$lockedOperation 对象就可以重复使用。实际的锁由在执行操作时注入的 LockableInterface
实例定义。
此实例可以用作服务容器(如Symfony组件)内部,其中实现 LockHandlerInterface
的类可以在配置中定义,并自动注入到锁定处理器“服务”中。