/
githubmirror
/
framework
Обзор
Документация
Войти
/
githubmirror
/
framework
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
13.x
src/Illuminate/Bus/UniqueLock.php
106 строк
3 KB
Taylor Otwell
Attempt at lock fix (#60906)
03 авг 2026, 01:16
Не верифицирован
03 авг 2026, 01:16
f7bb662
Код
Авторство
О чём код?
<?php namespace Illuminate\Bus; use Illuminate\Contracts\Cache\LockProvider; use Illuminate\Contracts\Cache\Repository as Cache; use Illuminate\Queue\Attributes\ReadsQueueAttributes; use Illuminate\Queue\Attributes\UniqueFor; class UniqueLock { use ReadsQueueAttributes; /** * The cache repository implementation. * * @var \Illuminate\Contracts\Cache\Repository */ protected $cache; /** * Create a new unique lock manager instance. * * @param \Illuminate\Contracts\Cache\Repository $cache */ public function __construct(Cache $cache) { $this->cache = $cache; } /** * Attempt to acquire a lock for the given job. * * @param mixed $job * @return bool */ public function acquire($job) { $uniqueFor = method_exists($job, 'uniqueFor') ? $job->uniqueFor() : ($this->getAttributeValue($job, UniqueFor::class, 'uniqueFor') ?? 0); $cache = method_exists($job, 'uniqueVia') ? ($job->uniqueVia() ?? $this->cache) : $this->cache; $lock = $cache->lock(self::getKey($job), $uniqueFor); if (! $lock->get()) { return false; } if (isset(class_uses_recursive($job)[Queueable::class]) && $cache->getStore() instanceof LockProvider) { $job->uniqueLockOwner = $lock->owner(); } return true; } /** * Release the lock for the given job. * * @param mixed $job * @return void */ public function release($job) { $cache = method_exists($job, 'uniqueVia') ? ($job->uniqueVia() ?? $this->cache) : $this->cache; $owner = isset(class_uses_recursive($job)[Queueable::class]) ? ($job->uniqueLockOwner ?? '') : ''; if (is_string($owner) && $owner !== '') { if ($cache->getStore() instanceof LockProvider) { $cache->restoreLock(self::getKey($job), $owner)->release(); } return; } $cache->lock(self::getKey($job))->forceRelease(); } /** * Generate the lock key for the given job. * * @param mixed $job * @return string */ public static function getKey($job) { $uniqueId = method_exists($job, 'uniqueId') ? $job->uniqueId() : ($job->uniqueId ?? ''); $jobName = method_exists($job, 'displayName') ? hash('xxh128', $job->displayName()) : get_class($job); return 'laravel_unique_job:'.$jobName.':'.$uniqueId; } }