spiral/lock-bridge

此包为RoadRunner Lock提供了一个集成桥接。

1.x-dev 2023-07-17 07:20 UTC

This package is auto-updated.

Last update: 2024-08-28 14:02:21 UTC


README

PHP Version Require Latest Stable Version phpunit psalm Codecov Total Downloads

此包为RoadRunner Lock提供了一个集成桥接,这使得在Spiral Framework中管理分布式锁变得简单。该包提供了一种快速、轻量级且可靠的方式来获取、释放和管理分布式环境中的锁,非常适合用于高流量Web应用和微服务。

要求

确保您的服务器已配置以下PHP版本和扩展

  • PHP 8.1+
  • Spiral Framework 3.7+

安装

您可以通过composer安装此包

composer require spiral/lock-bridge

在安装包之后,您需要从包中注册引导加载器。

protected const LOAD = [
    // ...
    \Spiral\LockBridge\Bootloader\LockBootloader::class,
];

注意 如果您正在使用 spiral-packages/discoverer,则无需自行注册引导加载器。

用法

use RoadRunner\Lock\LockInterface;

$lock = $container->get(LockInterface::class);

获取锁

锁定资源,使其一次只能被一个进程访问。当一个资源被锁定时,尝试锁定同一资源的其他进程将被阻塞,直到锁被释放。

$id = $lock->lock('pdf:create');

// Acquire lock with ttl - 10 seconds
$id = $lock->lock('pdf:create', ttl: 10);
// or
$id = $lock->lock('pdf:create', ttl: new \DateInterval('PT10S'));

// Acquire lock and wait 5 seconds until lock will be released
$id = $lock->lock('pdf:create', wait: 5);
// or
$id = $lock->lock('pdf:create', wait: new \DateInterval('PT5S'));

// Acquire lock with id - 14e1b600-9e97-11d8-9f32-f2801f1b9fd1
$id = $lock->lock('pdf:create', id: '14e1b600-9e97-11d8-9f32-f2801f1b9fd1');

获取读锁

锁定资源以进行共享访问,允许多个进程同时访问资源。当一个资源被锁定进行共享访问时,尝试锁定资源进行独占访问的其他进程将被阻塞,直到所有共享锁被释放。

$id = $lock->lockRead('pdf:create', ttl: 10);
// or
$id = $lock->lockRead('pdf:create', ttl: new \DateInterval('PT10S'));

// Acquire lock and wait 5 seconds until lock will be released
$id = $lock->lockRead('pdf:create', wait: 5);
// or
$id = $lock->lockRead('pdf:create', wait: new \DateInterval('PT5S'));

// Acquire lock with id - 14e1b600-9e97-11d8-9f32-f2801f1b9fd1
$id = $lock->lockRead('pdf:create', id: '14e1b600-9e97-11d8-9f32-f2801f1b9fd1');

释放锁

释放通过调用lock()lockRead()之前获取的资源上的独占锁或读锁。

// Release lock after task is done.
$lock->release('pdf:create', $id);

// Force release lock
$lock->forceRelease('pdf:create');

检查锁

检查资源是否当前被锁定,并返回有关锁的信息。

$status = $lock->exists('pdf:create');
if($status) {
    // Lock exists
} else {
    // Lock not exists
}

更新TTL

更新已锁定资源的存活时间(TTL)。

// Add 10 seconds to lock ttl
$lock->updateTTL('pdf:create', $id, 10);
// or
$lock->updateTTL('pdf:create', $id, new \DateInterval('PT10S'));

测试

composer test

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件