getLockFileName($key); if (! is_file($filename)) { return false; } $time = $this->getLockTime($filename); $content = $this->getLockContent($filename); if ($content === false || $time === false) { @unlink($filename); return false; } if ($lock && $content === $lock->value) { return false; } // outdated lock if ($time + $this->lockLifetime <= time()) { @unlink($filename); return false; } return true; } private function getLockFileName(CacheKey $key): string { return $this->directory . DIRECTORY_SEPARATOR . $key->hash . '.' . self::LOCK_EXTENSION; } private function getLockContent(string $filename): string|false { return @file_get_contents($filename); } private function getLockTime(string $filename): int|false { return @fileatime($filename); } public function getName(): string { return $this->region->getName(); } public function contains(CacheKey $key): bool { if ($this->isLocked($key)) { return false; } return $this->region->contains($key); } public function get(CacheKey $key): CacheEntry|null { if ($this->isLocked($key)) { return null; } return $this->region->get($key); } public function getMultiple(CollectionCacheEntry $collection): array|null { if (array_filter(array_map($this->isLocked(...), $collection->identifiers))) { return null; } return $this->region->getMultiple($collection); } public function put(CacheKey $key, CacheEntry $entry, Lock|null $lock = null): bool { if ($this->isLocked($key, $lock)) { return false; } return $this->region->put($key, $entry); } public function evict(CacheKey $key): bool { if ($this->isLocked($key)) { @unlink($this->getLockFileName($key)); } return $this->region->evict($key); } public function evictAll(): bool { // The check below is necessary because on some platforms glob returns false // when nothing matched (even though no errors occurred) $filenames = glob(sprintf('%s/*.%s', $this->directory, self::LOCK_EXTENSION)) ?: []; foreach ($filenames as $filename) { @unlink($filename); } return $this->region->evictAll(); } public function lock(CacheKey $key): Lock|null { if ($this->isLocked($key)) { return null; } $lock = Lock::createLockRead(); $filename = $this->getLockFileName($key); if (@file_put_contents($filename, $lock->value, LOCK_EX) === false) { return null; } chmod($filename, 0664); return $lock; } public function unlock(CacheKey $key, Lock $lock): bool { if ($this->isLocked($key, $lock)) { return false; } return @unlink($this->getLockFileName($key)); } }