Lock
in package
Именованная блокировка ресурса с уникальным владельцем.
Обёртка над 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
Return values
T —результат выполнения $callback