Semaphore
in package
Счётный семафор: допускает не более N одновременных держателей ресурса.
Обобщение блокировки: там, где Lock даёт эксклюзивный доступ (N = 1), семафор пропускает до N параллельных владельцев — например, ограничить число одновременных обращений к внешнему API или воркеров на пул соединений.
Реализован композицией N именованных слотов поверх LockFactory: захват пытается занять первый свободный слот, снятие — освобождает занятый. Поэтому семафор работает на любом хранилище (память/flock/PSR-16) и наследует его гарантии атомарности и TTL.
$semaphore = Locks::flock('/var/lock')->semaphore('api-quota', slots: 3);
if ($semaphore->acquire()) {
try {
// не более трёх процессов одновременно в этой секции
} finally {
$semaphore->release();
}
}
Table of Contents
Methods
- __construct() : mixed
- acquire() : bool
- Попытаться занять свободный слот семафора без ожидания.
- release() : void
- Освободить занятый слот (если он удерживается этим семафором).
Methods
__construct()
public
__construct(LockFactory $factory, string $resource, int $slots[, int|null $ttlSeconds = null ]) : mixed
Parameters
- $factory : LockFactory
-
фабрика блокировок для слотов
- $resource : string
-
имя разделяемого ресурса
- $slots : int
-
число одновременных держателей (ёмкость семафора)
- $ttlSeconds : int|null = null
-
срок жизни слота для хранилищ с TTL;
null— до явного снятия
acquire()
Попытаться занять свободный слот семафора без ожидания.
public
acquire() : bool
Return values
bool —true, если слот занят; false, если все слоты заняты либо
этот семафор уже удерживает слот
release()
Освободить занятый слот (если он удерживается этим семафором).
public
release() : void