Метод lock
Метод lock используется для создания блокировки на основе ключа кэша.
Это позволяет организовать атомарную операцию, гарантируя,
что критический участок кода будет выполнен только одним процессом
в единицу времени. Первым параметром передаётся ключ блокировки,
вторым - время жизни блокировки в секундах (по умолчанию 60 секунд).
Синтаксис
<?php
Cache::lock($key, $ttl);
?>
Пример
Давайте создадим блокировку для ключа 'processing' и выполним некоторую работу в защищённом блоке:
<?php
use Illuminate\Support\Facades\Cache;
$lock = Cache::lock('processing', 30);
if ($lock->get()) {
try {
// Critical section of code
echo "Processing data...";
// Simulate long running task
sleep(2);
echo "Task completed successfully";
} finally {
$lock->release();
}
} else {
echo "Unable to acquire lock";
}
?>
Результат выполнения кода:
"Processing data..."
"Task completed successfully"
Пример
Используем блокировку с автоматическим освобождением
с помощью метода block, который ожидает освобождения
блокировки в течение указанного времени:
<?php
use Illuminate\Support\Facades\Cache;
$lock = Cache::lock('user-update', 10);
$lock->block(5, function () {
// This code will execute only after lock is acquired
$res = ['status' => 'updated', 'user_id' => 1];
echo json_encode($res);
});
?>
Результат выполнения кода:
"{"status":"updated","user_id":1}"
Пример
Проверим, занята ли блокировка, и выполним разные действия в зависимости от её состояния:
<?php
use Illuminate\Support\Facades\Cache;
$lock = Cache::lock('report-generation', 60);
if ($lock->get()) {
// Generate report
$res = ['report' => 'Generated at ' . date('Y-m-d H:i:s')];
echo "Report: " . $res['report'];
$lock->release();
} else {
echo "Another process is already generating report";
}
?>
Результат выполнения кода:
"Report: Generated at 2026-09-07 14:30:25"