CloudCastle Lock API

Semaphore
in package

FinalYes

Счётный семафор: допускает не более 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
On this page

Search results