CloudCastle Lock API

Lock
in package

FinalYes

Именованная блокировка ресурса с уникальным владельцем.

Обёртка над LockStore, привязанная к конкретному ресурсу, токену владельца и (для хранилищ с TTL) сроку жизни. Только этот владелец может снять или продлить свою блокировку — посторонний токен не освободит ресурс.

$lock = $factory->create('order:42', ttlSeconds: 30);

if ($lock->acquire()) {
    try {
        // критическая секция
    } finally {
        $lock->release();
    }
}

// либо одним вызовом (захват → выполнение → гарантированное снятие):
$result = $lock->synchronized(fn (): string => processOrder());

Table of Contents

Methods

__construct()  : mixed
acquire()  : bool
Попытаться захватить блокировку без ожидания.
block()  : bool
Захватить блокировку, дожидаясь освобождения ресурса (блокирующе).
isAcquired()  : bool
Удерживается ли ресурс блокировкой (любым владельцем) в данный момент.
key()  : string
Ключ ресурса этой блокировки.
refresh()  : bool
Продлить срок жизни удерживаемой блокировки.
release()  : void
Снять блокировку (если она принадлежит этому владельцу).
remainingTtl()  : int|null
Остаток срока жизни блокировки в секундах (для хранилищ с TTL).
synchronized()  : T
Выполнить критическую секцию под блокировкой: захватить, выполнить и гарантированно снять (даже при исключении внутри).

Methods

__construct()

public __construct(LockStore $store, string $key, string $owner, int|null $ttlSeconds, Sleeper $sleeper) : mixed
Parameters
$store : LockStore

хранилище блокировок (файлы/кэш/память)

$key : string

ключ ресурса

$owner : string

уникальный токен владельца этой блокировки

$ttlSeconds : int|null

срок жизни в секундах (для хранилищ с TTL); null — до явного снятия

$sleeper : Sleeper

пауза между попытками при блокирующем ожидании

acquire()

Попытаться захватить блокировку без ожидания.

public acquire() : bool
Return values
bool

true, если блокировка захвачена; false, если ресурс занят

block()

Захватить блокировку, дожидаясь освобождения ресурса (блокирующе).

public block([float|null $timeoutSeconds = null ][, float $retryIntervalSeconds = self::DEFAULT_RETRY_INTERVAL ]) : bool

Повторяет неблокирующий acquire() с паузой Sleeper между попытками, пока ресурс не освободится или не истечёт таймаут. При $timeoutSeconds === null ждёт неограниченно долго.

// Ждать освобождения не дольше 5 секунд:
if ($lock->block(5.0)) {
    try {
        // критическая секция
    } finally {
        $lock->release();
    }
}
Parameters
$timeoutSeconds : float|null = null

максимальное время ожидания в секундах; null — ждать без ограничения

$retryIntervalSeconds : float = self::DEFAULT_RETRY_INTERVAL

пауза между попытками захвата в секундах

Return values
bool

true, если блокировка захвачена в отведённое время; false, если истёк таймаут

isAcquired()

Удерживается ли ресурс блокировкой (любым владельцем) в данный момент.

public isAcquired() : bool
Return values
bool

true, если ресурс заблокирован

key()

Ключ ресурса этой блокировки.

public key() : string
Return values
string

ключ ресурса

refresh()

Продлить срок жизни удерживаемой блокировки.

public refresh() : bool
Return values
bool

true, если блокировка принадлежит владельцу и продлена

release()

Снять блокировку (если она принадлежит этому владельцу).

public release() : void

remainingTtl()

Остаток срока жизни блокировки в секундах (для хранилищ с TTL).

public remainingTtl() : int|null

Позволяет узнать, сколько ещё живёт удерживаемая блокировка, и вовремя её продлить refresh(). Для хранилищ без понятия TTL (файловый flock) всегда null.

Return values
int|null

секунды до автоистечения; null, если хранилище не поддерживает TTL, блокировка не удерживается этим владельцем или она бессрочна

synchronized()

Выполнить критическую секцию под блокировкой: захватить, выполнить и гарантированно снять (даже при исключении внутри).

public synchronized(callable(): T $callback) : T
Parameters
$callback : callable(): T

критическая секция

Tags
template
throws
LockConflictException

если ресурс уже занят другим владельцем

Return values
T

результат выполнения $callback

On this page

Search results