FlockStore
in package
implements
LockStore
Файловое хранилище блокировок на основе `flock`.
Каждый ресурс — отдельный lock-файл в каталоге (имя — SHA-256 от ключа, что
исключает выход за каталог и недопустимые символы). Взаимное исключение между
процессами обеспечивает ядро через flock(LOCK_EX): захват атомарен и
межпроцессно надёжен.
Дескриптор lock-файла открывается лениво при первом обращении к ресурсу и
переиспользуется между захватами: снятие блокировки освобождает flock, но
не закрывает файл, поэтому повторный захват того же ресурса не платит за
fopen/fclose — критично для «горячих» сценариев (воркер многократно берёт
блокировку одного ресурса). Все дескрипторы закрываются в деструкторе.
flock-блокировка автоматически освобождается при завершении процесса-держателя
(в т.ч. аварийном), поэтому «зависших навсегда» блокировок не остаётся и TTL не
требуется — параметр срока жизни для этого хранилища игнорируется. В пределах
одного процесса повторный захват уже удерживаемого ресурса запрещён
(нереентерабельно): второй acquire() вернёт false.
Table of Contents
Interfaces
- LockStore
- Хранилище блокировок: единая абстракция над механизмами взаимного исключения (файловые `flock`, кэш с TTL, память процесса), поверх которой работает {@see \CloudCastle\Lock\Lock}.
Methods
- __construct() : mixed
- __destruct() : mixed
- Закрыть все переиспользуемые дескрипторы lock-файлов.
- acquire() : bool
- Попытаться захватить блокировку без ожидания (неблокирующе).
- isAcquired() : bool
- Удерживается ли блокировка (любым владельцем) в данный момент.
- refresh() : bool
- Продлить срок жизни блокировки, удерживаемой этим владельцем.
- release() : void
- Снять блокировку, если она принадлежит этому владельцу.
Methods
__construct()
public
__construct(string $directory) : mixed
Parameters
- $directory : string
-
каталог для lock-файлов (создаётся при необходимости)
__destruct()
Закрыть все переиспользуемые дескрипторы lock-файлов.
public
__destruct() : mixed
acquire()
Попытаться захватить блокировку без ожидания (неблокирующе).
public
acquire(string $key, string $owner, int|null $ttlSeconds) : bool
Parameters
- $key : string
-
ключ ресурса
- $owner : string
-
уникальный токен владельца
- $ttlSeconds : int|null
-
срок жизни в секундах для хранилищ с TTL;
null— до явного снятия
Attributes
- #[Override]
Return values
bool —true, если блокировка захвачена этим владельцем; false,
если она уже удерживается кем-то другим
isAcquired()
Удерживается ли блокировка (любым владельцем) в данный момент.
public
isAcquired(string $key) : bool
Parameters
- $key : string
-
ключ ресурса
Attributes
- #[Override]
Return values
bool —true, если ресурс заблокирован и блокировка не истекла
refresh()
Продлить срок жизни блокировки, удерживаемой этим владельцем.
public
refresh(string $key, string $owner, int|null $ttlSeconds) : bool
flock не имеет TTL, поэтому продление сводится к подтверждению владения:
блокировка удерживается до снятия или завершения процесса.
Parameters
- $key : string
-
ключ ресурса
- $owner : string
-
токен владельца
- $ttlSeconds : int|null
-
новый срок жизни в секундах;
null— бессрочно
Attributes
- #[Override]
Return values
bool —true, если блокировка принадлежит владельцу и продлена
release()
Снять блокировку, если она принадлежит этому владельцу.
public
release(string $key, string $owner) : void
Parameters
- $key : string
-
ключ ресурса
- $owner : string
-
токен владельца
Attributes
- #[Override]