Класс Lock
Класс Lock представляет собой блокировку ресурса
и позволяет организовать безопасную работу с общими
данными в условиях конкурентного доступа. Экземпляр
класса создаётся через LockFactory или через
сервис lock.factory. Класс предоставляет методы
acquire, release, isAcquired и
refresh, которые управляют жизненным циклом
блокировки. Первым параметром в методы acquire
и refresh передаётся флаг блокировки: false
для неблокирующего режима или true для ожидания
освобождения ресурса.
Синтаксис
$lock->acquire(blocking: false);
$lock->release();
$lock->isAcquired();
$lock->refresh(blocking: false);
Пример
Давайте создадим блокировку через LockFactory
и захватим ресурс:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Lock\LockFactory;
use Symfony\Component\Lock\Store\InMemoryStore;
use Symfony\Component\Routing\Attribute\Route;
class LockController extends AbstractController
{
#[Route('/lock', name: 'lock_index')]
public function index(): Response
{
$store = new InMemoryStore();
$factory = new LockFactory($store);
$lock = $factory->createLock('resource');
if ($lock->acquire()) {
$res = 'lock acquired';
$lock->release();
} else {
$res = 'lock busy';
}
return new Response($res);
}
}
?>
Результат выполнения кода:
"lock acquired"
Пример
Давайте проверим состояние блокировки через
isAcquired после захвата:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Lock\LockFactory;
use Symfony\Component\Lock\Store\InMemoryStore;
use Symfony\Component\Routing\Attribute\Route;
class LockController extends AbstractController
{
#[Route('/lock/state', name: 'lock_state')]
public function state(): Response
{
$store = new InMemoryStore();
$factory = new LockFactory($store);
$lock = $factory->createLock('resource');
$lock->acquire();
$res = $lock->isAcquired() ? 'acquired' : 'released';
$lock->release();
return new Response($res);
}
}
?>
Результат выполнения кода:
"acquired"
Пример
Давайте обновим время жизни блокировки через
refresh, чтобы продлить её действие:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Lock\LockFactory;
use Symfony\Component\Lock\Store\InMemoryStore;
use Symfony\Component\Routing\Attribute\Route;
class LockController extends AbstractController
{
#[Route('/lock/refresh', name: 'lock_refresh')]
public function refresh(): Response
{
$store = new InMemoryStore();
$factory = new LockFactory($store);
$lock = $factory->createLock('resource', ttl: 1.0);
$lock->acquire();
sleep(1);
$refreshed = $lock->refresh();
$res = $refreshed ? 'refreshed' : 'expired';
$lock->release();
return new Response($res);
}
}
?>
Результат выполнения кода:
"refreshed"
Смотрите также
-
класс
LockFactory,
который создаёт экземпляры блокировок -
метод
acquire,
который захватывает блокировку ресурса -
метод
release,
который освобождает захваченную блокировку -
метод
isAcquired,
который проверяет состояние блокировки